2014-11-05 64 views
1

我試圖設置一些變量的默認值。我知道該怎麼做,但我想用子程序來完成這個任務,而且我遇到了問題。將值設置爲未定義的變量

我有這三個變量:$t, $insize, $libtype. 這是一個簡單的功能設置默認值給他們,如果他們是不確定的:

sub SetUnlessDefined { 
    my $t = 1 if !(defined $t); 
    my $insize = 300 if !(defined $insize); 
    my $libtype = 0 if !(defined $libtype); 
    return($t, $insize, $libtype); 
} 

我執行這樣的功能:

($t, $insize, $libtype) = SetUnlessDefined($t, $insize, $libtype); 

如果我的所有變量都未定義,則該函數運行正常,但是如果我對它們中的任何一個都有值,則說明它不起作用。

任何人都可以建議我一個解決方案?或者一個正確的方法來檢查變量是否被定義,以及它們是否沒有設置值?

在此先感謝

回答

4

你不讀的子程序中的參數:

sub defaults { 
    my ($t, $insize, $libtype) = @_; # <--- HERE 
    $t = 1 unless defined $t; 
    $insize = 300 unless defined $insize; 
    $libtype = 0 unless defined $libtype; 
    return ($t, $insize, $libtype); 
} 

還有其他的方法如何對待這項任務,但:

sub defaults { 
    my @defaults = (1, 300, 0); 
    for my $i (0 .. $#defaults) { 
     $_[$i] //= $defaults[$i]; # Perl 5.10 needed 
    } 
} 

無在子程序調用中需要賦值,因爲參數是別名@_的成員:

defaults($t, $insize, $libtype); 
+0

哦,上帝...愚蠢的錯誤,在電腦前幾個小時。謝謝@choroba。 – cucurbit 2014-11-05 15:01:40

0

my $t代碼的一部分始終運行,因此在定義全局$t的情況下,本地$t被實例化爲未定義的並且被返回。

一種解決方法是使用這樣的

if (! defined $t) { 
    my $t = 1 ; 
} 

或者,也許只是

if (! defined $t) { 
    $t = 1 ; 
} 

,不返回任何東西。

您還發送參數的功能,這被忽略了......也許整個事情可能沒有參數的重做,沒有第二次分配,這樣

sub SetUnlessDefined { 
    if (! defined $t) { 
     $t = 1 ; 
    } 
    if (! defined $insize) { 
     $insize = 3000; 
    } 
    if (! defined $libtype) { 
     $libtype = 0; 
    } 
} 


SetUnlessDefined();