“T”和“F”在Perl 5.16.3中有特殊含义吗?

时间:2013-10-04 16:04:10

标签: perl

我有一些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

2 个答案:

答案 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) {
}
你会没事的。