【问题标题】:Do 'T' and 'F' have special meaning in Perl 5.16.3?'T' 和 'F' 在 Perl 5.16.3 中是否有特殊含义?
【发布时间】:2013-10-04 16:04:09
【问题描述】:

我有一些 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' 为 null ''(因此 $shouldInstall 为 '')。如果我将测试更改为$test_setup{appl}{Rev0_OK} eq 'F',则为 1 (TRUE)。如果我将测试更改为$test_setup{appl}{Rev0_OK} ne 'F',它再次为空。这里发生了什么?没有发出错误消息。我确实定义了布尔变量 TRUE 和 FALSE(如 int 1 和 0)。

aTdHvAaNnKcSe

【问题讨论】:

  • 回复:“我确实定义了布尔变量 TRUE 和 FALSE(如 int 1 和 0)。”只是不要做... == FALSE... == TRUE
  • 我没有比较我的 TRUE 和 FALSE 常量。只是if ($shouldInstall) {... 我只是在评论我碰巧有这些常量,以防它们对这里的情况有影响。或许我可以更清楚一点。
  • 我知道你不在这里;我给出了一般性的建议。创建 TRUEFALSE 常量的人倾向于检查它们,当语言的定义与常量不同时,这没有意义,就像这里的情况一样。

标签: perl


【解决方案1】:

$shouldInstall 以空值结束(预期为 false/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 或 0 的“真”或“假”结果(包括“eq”等字符串比较)。这看起来很奇怪,而且不一致的是,我得到一个整数 1 表示真,一个空字符串表示假,即使从技术上讲它们有效。
  • 回复:“这是我第一次记得看到'真'或'假'结果 [...] 没有打印为 1 或 0。”,你尝试了什么? !?!?! perl -wle'print "a" eq "b"'perl -wle'print 3 == 4'perl -wle'print !1
  • Re: "and an empty string for false", 你没有得到一个空字符串作为 false。从技术上讲,你得到整数和字符串一为真。
【解决方案2】:

这些比较的结果似乎很好:(某种形式)true 当“T”/“F”值匹配时,(某种形式)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) {
}

你会没事的。

【讨论】:

  • 有趣。每次我之前转储“真”或“假”结果时,包括“eq”结果,我都会得到一个整数 1 或 0。所以看到一个空字符串 (?) 的结果让我很震惊。
猜你喜欢
  • 1970-01-01
  • 2013-04-18
  • 2015-09-08
  • 2019-08-03
  • 1970-01-01
  • 1970-01-01
  • 2015-04-05
  • 2023-03-27
相关资源
最近更新 更多