在Perl 5.16.3中,“T”和“F”是否有特殊含义?

在Perl 5.16.3中,“T”和“F”是否有特殊含义?,perl,Perl,我有一些Perl代码在做一些我无法理解的奇怪的事情。我在本节代码前面定义了两个变量: $latestPatch = '000'; $test_setup{appl}{Rev0_OK} = 'F'; # a hash element 两者都定义为字符串。如果我打印出环绕着它们的原始变量,'int$latestPatch'是'0','test_setup{appl}{Rev0_OK}'是'F'。到目前为止,正如预期的那样。现在我运行以下命令: $shouldInstall = int($late

我有一些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以空值false结束,应为/0!打印“$shouldInstall”将提供。未显示的分步调试语句表明int$latestPatch==0正常工作,为1 TRUE,但$test_setup{appl}{Rev0_OK}eq'T'为空,因此$shouldInstall为空。如果我将test更改为$test\u setup{appl}{Rev0\u OK}eq'F',则为1。如果我将test更改为$test\u setup{appl}{Rev0\u OK}ne'F',它再次为null。这是怎么回事?没有发出任何错误消息。我确实将布尔变量TRUE和FALSE定义为int 1和0


aTdHvAaNnKcSe

这些比较的结果似乎很好:当'T'/'F'值匹配时,有些形式为真,反之则为假

您似乎假设布尔值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) {
}

你会没事的。

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

您似乎假设布尔值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) {
}
你会没事的

$shouldInstall以空值false结束,应为/0!打印“$shouldInstall”将提供

$shouldInstall应该以false结束,它确实如此。空字符串与0一样为false。看看这个解释什么是假的

大多数运算符返回&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
$shouldInstall以空值false结束,应为/0!打印“$shouldInstall”将提供

$shouldInstall应该以false结束,它确实如此。空字符串与0一样为false。看看这个解释什么是假的

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

Re:我确实有布尔变量TRUE和FALSE定义为int 1和0。只是不要做…==错误或…==符合事实的我没有拿我的真常数和假常数进行比较。如果$shouldInstall{…我只是评论说,我碰巧有这些常量,以防它们与本案有关。也许我可以更清楚地说明这一点。我知道你不在这里;我是在提供一般性建议。创建真常量和假常量的人往往会对照它们进行检查,这在语言的定义不同于t时没有意义Re:我确实有布尔变量TRUE和FALSE定义为int 1和0。只是不做…==FALSE或…==TRUE!我没有比较我的TRUE和FALSE常量。如果$shouldInstall{…我只是评论说,我碰巧有这些常量,以防它们与本案有关。也许我可以更清楚地说明这一点。我知道你不在这里;我是在提供一般性建议。创建真常量和假常量的人往往会对照它们进行检查,这在语言的定义不同于t时没有意义他像这里一样保持常量。有趣。每次我以前转储'true'或'false'结果,包括'eq'结果,我都得到一个整数1或0。因此看到结果的空字符串让我感到困惑。有趣。每次我以前转储'true'或'false'结果,包括'eq'结果,我都得到一个整数1或0。所以看到一个空字符串结果是y字符串。这是我第一次记得看到“真”或“假”结果,包括“eq”等。字符串比较没有打印为1或0。我得到一个整数1表示真,一个空字符串表示假,这似乎很奇怪和不一致,即使从技术上讲,它们工作正常。Re:这是我第一次记得看到“真”或“假”结果[…]那不是打印成1或0,你试了什么?!?!perl-wle'print a eq b',perl-wle'print 3==4',perl-wle'print!1,etcRe:空字符串表示false,空字符串表示false,空字符串表示false。从技术上讲,整数和字符串表示true。这是我第一次看到“true”或“false”结果
s包括“eq”等字符串比较,这些字符串比较没有打印为1或0。看起来奇怪和不一致的是,我得到了一个整数1表示真,一个空字符串表示假,即使从技术上讲它们是有效的。Re:这是我第一次记得看到“真”或“假”结果[…]没有打印为1或0,你尝试了什么?!?!?!perl-wle'print a eq b',perl-wle'print 3==4',perl-wle'print!1,etcRe:false为空字符串,false为空字符串。从技术上讲,你得到的是整数和字符串。