为什么我的Perl程序会警告未初始化的值?

时间:2010-02-12 09:06:29

标签: perl scripting warnings

我写了一个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 "" )”行,但变量已初始化..

任何想法如何摆脱这个警告......

3 个答案:

答案 0 :(得分:7)

另一种选择是

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

如果未定义,则将$status设置为空字符串,但//运算符仅存在于perl 5.10及更高版本中。等效的5.10之前的语法是

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

虽然很多人会伪装它

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

但这会将$ENV{STATUS} 0更改为空字符串,这对您来说可能是也可能不是问题。

然而,这些都是一般情况的答案。在您发布的特定代码中,用

替换整个代码
$status = defined $ENV{STATUS} ? 1 : 0;

甚至只是

$status = defined $ENV{STATUS};

(如果你的'not set'值是一个空字符串而不是0),那将是更好的选择。

答案 1 :(得分:6)

$ENV{'STATUS'}可能未定义。

如果你跑

export STATUS=blah
在运行perl脚本之前在shell中

,它将起作用

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

答案 2 :(得分:3)

我知道您的问题是关于警告但您可以使用conditional operator ?:设置$ status(如果未定义)或空字符串

$status = $ENV{'STATUS'} ? 1 : 0;
相关问题