2010-02-12 64 views
2

我寫了一個Perl腳本,在其下面生成一個警告,我不知道爲什麼。爲什麼我的Perl程序會提醒未初始化的值?

#!/usr/local/bin/perl -w 

$status = $ENV{ 'STATUS' }; 
if ($status eq "") 
{ 
    $status = 0; 
} 
else 
{ 
    $status = 1; 
} 

它說: 「Use of uninitialized value in string eq at ./x.pl line 4.

4號線是 「if ($status eq "")」 行,但變量是初始化..

任何想法我如何能擺脫這種警告..

+2

如果您不知道,通常認爲'使用警告'而不是'-w'更好。有關更多信息,請參見perldoc perllexwarn:http://perldoc.perl.org/perllexwarn.html此外,在模塊中使用strict應該是個好主意。嚴格有助於防止很多頭痛。 – daotoad 2010-02-12 17:44:52

回答

6

$ENV{'STATUS'}可能未被定義。

如果

export STATUS=blah 

在shell中運行perl腳本運行之前,它會工作

#!/usr/local/bin/perl -w 
$status = $ENV{ 'STATUS' }; 
if (!defined($status) || $status eq "") 
{ 
    $status = 0; 
} 
else 
{ 
    $status = 1; 
} 
+0

設置env var or not不起作用。我先試了一下。 – ScaryAardvark 2010-02-12 09:18:06

+0

但定義的($狀態)似乎在做伎倆,thx。 – ScaryAardvark 2010-02-12 09:20:58

+3

爲什麼不'if if(defined $ status and length $ status){$ status = 1} else {$ status = 0}'?它使條件更簡單一些。 – daotoad 2010-02-12 17:41:43

3

修復它,我知道你的問題是關於警告,但你可以如果未定義或爲空,則使用conditional operator ?:設置$狀態字符串

$status = $ENV{'STATUS'} ? 1 : 0; 
+6

請注意,這並沒有區分'$ ENV {STATUS}'沒有被設置,'$ ENV {STATUS}'被設置爲0.這通常不是問題,但在某些情況下可能會導致細微的錯誤。 – 2010-02-12 11:30:20

+0

這是一個相當常見的新手bug(爲什麼人們會投它?)。如果該值尚未定義,則只需設置默認值。如果你使用Perl 5.10,你可以使用'$ status = $ ENV {'STATUS'} // 0; 。在Perl 5.10之前,你必須提取'defined'來檢查它。 – 2010-02-12 21:15:29

+0

@brian:「你必須抽出定義來檢查」,你的意思是$ status = defined($ ENV {'STATUS'})? 1:0; ? 如果$ ENV {'STATUS'}被設置爲空字符串(export STATUS =''),則定義的 ($ ENV {'STATUS'})將評估爲true(值已設置),因此$ status將爲設置爲1,但$ ENV {'STATUS'}將評估爲false,因此將$ status設置爲0; OP希望在最後如果有空字符串,$ status = 0。我是否誤解了某些內容? – ccheneson 2010-02-12 22:27:32

7

另一種選擇是

$status = $ENV{ 'STATUS' } // ''; 

將設置$status爲空字符串,如果沒有定義它,但//操作者只需在Perl 5.10和以後版本。等效前5.10語法

$status = defined $ENV{STATUS} ? $ENV{STATUS} : ''; 

雖然很多人會僞造其與

$status = $ENV{ 'STATUS' } || ''; 

但這種情況將會改變0-5的$ENV{STATUS}到一個空字符串,它可能會或可能不會是一個問題給你。

但是,這些都是一般情況下的答案。在特定的代碼,你貼出來,與

$status = defined $ENV{STATUS} ? 1 : 0; 

甚至只是

$status = defined $ENV{STATUS}; 

更換整個事情(如果你用「未設置」值是一個空字符串,而不是0 OK)將是更好的選擇。

相關問題