1

我有一些 Perl 代码正在做一些我无法弄清楚的奇怪事情。我在这部分代码之前定义了两个变量:

$latestPatch = '000';
$test_setup{appl}{Rev0_OK} = 'F';  # a hash element

两者都定义为字符串。如果我打印出原始变量(将 ' 包裹在它们周围),'int($latestPatch)'is'0''$test_setup{appl}{Rev0_OK}'is 'F'。到目前为止,正如预期的那样。现在我运行以下命令:

$shouldInstall = int($latestPatch) == 0 &&
                 $test_setup{appl}{Rev0_OK} eq 'T';

$shouldInstall以空值结束(预期为 false/0)!(打印'$shouldInstall'给出'')。逐步调试语句(未显示)表明int($latestPatch) == 0工作正常,给出 1 (TRUE),但$test_setup{appl}{Rev0_OK} eq 'T'为 null ''(因此$shouldInstall为 '')。如果我将测试更改为$test_setup{appl}{Rev0_OK} eq 'F',则为 1 (TRUE)。如果我将测试更改为$test_setup{appl}{Rev0_OK} ne 'F',它再次为空。这里发生了什么?没有发出错误消息。我确实定义了布尔变量 TRUE 和 FALSE(如 int 1 和 0)。

ATDHVANNKcSe

4

2 回答 2

5

$shouldInstall以空值结束(预期为 false/0)!(打印'$shouldInstall'给出'')。

$shouldInstall最终应该是假的,它确实如此。空字符串与0. 请参阅this answer解释什么是错误的。

大多数运算符返回&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

如果您将其用作字符串,它将是空字符串。如果你用一个数字,它会是零。

$ 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
于 2013-10-04T16:15:27.290 回答
3

这些比较的结果似乎很好:(某种形式)true当“T”/“F”值匹配时,(某种形式)false否则。

您似乎假设 booleanfalse将评估为整数 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) {
}

你会没事的。

于 2013-10-04T16:13:09.717 回答