我有一些Perl代码正在做一些奇怪的事情,我无法弄明白。我在这部分代码之前定义了两个变量:
$latestPatch = '000';
$test_setup{appl}{Rev0_OK} = 'F'; # a hash element
两者都被定义为字符串。如果我打印出原始变量(围绕它们包裹),'int($latestPatch)'
为'0'
而'$test_setup{appl}{Rev0_OK}'
为'F'
。到目前为止,正如所料。现在我运行以下内容:
$shouldInstall = int($latestPatch) == 0 &&
$test_setup{appl}{Rev0_OK} eq 'T';
$shouldInstall
最终得到一个空值(假设为假/ 0)! (打印'$shouldInstall'
给'')。逐步调试语句(未显示)表明int($latestPatch) == 0
工作正常,给出1(TRUE),但$test_setup{appl}{Rev0_OK} eq 'T'
为空'(因此$shouldInstall
是'') 。如果我将测试更改为$test_setup{appl}{Rev0_OK} eq 'F'
,则为1(TRUE)。如果我将测试更改为$test_setup{appl}{Rev0_OK} ne 'F'
,则它再次为空。这里发生了什么?没有发出错误消息。我确实有布尔变量TRUE和FALSE定义(作为int 1和0)。
aTdHvAaNnKcSe
答案 0 :(得分:5)
$shouldInstall
最终得到一个空值(假设为假/ 0)! (打印'$shouldInstall'
给'')。
$shouldInstall
最终应该是假的,而且确实如此。空字符串与0
一样错误。请参阅此answer解释什么是错误。
大多数运算符返回&PL_sv_no
为false,这是一个包含有符号整数0,浮点0和空字符串的标量。
$ perl -MDevel::Peek -e'Dump("a" eq "b")'
SV = PVNV(0x9c6d770) at 0x9c6c0f0
REFCNT = 2147483647
FLAGS = (PADTMP,IOK,NOK,POK,READONLY,pIOK,pNOK,pPOK)
IV = 0
NV = 0
PV = 0x8192558 ""
CUR = 0
LEN = 0
如果你使用它一个字符串,它将是空字符串。如果你使用它,它将为零。
$ perl -wle'print "".("a" eq "b")'
$ perl -wle'print 0+("a" eq "b")'
0
此标量与空字符串的不同之处在于,它在作为数字处理时不会发出警告。
$ perl -wle'print 0+""'
Argument "" isn't numeric in addition (+) at -e line 1.
0
答案 1 :(得分:3)
这些比较的结果似乎很好:{某种形式的)true
当'T'/'F'值匹配时,(某种形式)false
否则。{/ p>
您似乎假设布尔值false
将计算为整数0.没有理由期望这样。
例如:
$shouldInstall = undef;
print "'$shouldInstall'\n";
$shouldInstall = (1 == 2);
print "'$shouldInstall'\n";
$shouldInstall = "";
print "'$shouldInstall'\n";
$shouldInstall = (1 == 1);
print "'$shouldInstall'\n";
打印:
''
''
''
'1'
只要你明智地测试变量:
if ($shouldInstall) {
}
你会没事的。