我有一些Perl代码正在做一些奇怪的事情,我无法弄清楚.我在这段代码之前定义了两个变量:
$latestPatch = '000';
$test_setup{appl}{Rev0_OK} = 'F'; # a hash element
Run Code Online (Sandbox Code Playgroud)
两者都被定义为字符串.如果我打印出原始变量(包裹它们),'int($latestPatch)'是'0'和'$test_setup{appl}{Rev0_OK}'是'F'.到目前为止,正如所料.现在我运行以下内容:
$shouldInstall = int($latestPatch) == 0 &&
$test_setup{appl}{Rev0_OK} eq 'T';
Run Code Online (Sandbox Code Playgroud)
$shouldInstall最终得到一个空值(false/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
$shouldInstall最终得到一个空值(false/0预期)!(打印'$shouldInstall'给'').
$shouldInstall最终应该是假的,而且确实如此.空字符串与false一样错误0.看到这个答案解释什么是假的.
大多数运算符返回&PL_sv_nofalse,这是一个包含有符号整数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
Run Code Online (Sandbox Code Playgroud)
如果你使用它一个字符串,它将是空字符串.如果你使用它,它将为零.
$ perl -wle'print "".("a" eq "b")'
$ perl -wle'print 0+("a" eq "b")'
0
Run Code Online (Sandbox Code Playgroud)
此标量与空字符串的不同之处在于,它在作为数字处理时不会发出警告.
$ perl -wle'print 0+""'
Argument "" isn't numeric in addition (+) at -e line 1.
0
Run Code Online (Sandbox Code Playgroud)