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

Sca*_*ark 2 scripting perl warnings

我写了一个Perl脚本,下面会生成一个警告,我无法弄明白为什么.

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

$status = $ENV{ 'STATUS' };
if ( $status eq "" )
{
    $status = 0;
}
else
{
    $status = 1;
}
Run Code Online (Sandbox Code Playgroud)

它说" Use of uninitialized value in string eq at ./x.pl line 4."

第4行是" if ( $status eq "" )"行,但变量已初始化.

任何想法我怎么能摆脱这个警告..

Dav*_*man 7

另一种选择是

$status = $ENV{ 'STATUS' } // '';
Run Code Online (Sandbox Code Playgroud)

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

$status = defined $ENV{STATUS} ? $ENV{STATUS} : '';
Run Code Online (Sandbox Code Playgroud)

虽然很多人会假装它

$status = $ENV{ 'STATUS' } || '';
Run Code Online (Sandbox Code Playgroud)

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

然而,这些都是一般情况下的答案.在您发布的特定代码中,将整个内容替换为

$status = defined $ENV{STATUS} ? 1 : 0;
Run Code Online (Sandbox Code Playgroud)

甚至只是

$status = defined $ENV{STATUS};
Run Code Online (Sandbox Code Playgroud)

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


Cha*_* Ma 6

$ENV{'STATUS'} 可能没有定义.

如果你跑

export STATUS=blah
Run Code Online (Sandbox Code Playgroud)

在运行perl脚本之前的shell中,它会起作用

解决它

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

  • 为什么不`if(定义$ status和length $ status){$ status = 1} else {$ status = 0}`?它使条件更简单. (3认同)