【问题标题】:Why does Perl think -1 is true?为什么 Perl 认为 -1 是真的?
【发布时间】:2011-10-03 16:59:28
【问题描述】:

这是一段常见的示例代码:

while (1) { 
    print "foo\n"; 
}

永远打印“foo”。

perl foo.pl
foo
foo
foo
...

while (0) { print "foo\n"; } 

如你所料般安静地死去:

perl test.pl

有人能解释一下为什么这是一个有用的 while 实现吗?这至少适用于 5.10,Unix 和 MacOS X:

while (-1) { print "foo\n"; }

给了

foo
foo
foo
...

【问题讨论】:

  • -1 在许多语言中被认为是一个真正的价值。
  • 在 Perl 中,0 为假;任何不假的都是真的。
  • 我很好奇是什么导致了这个问题。有没有一种语言认为 -1 为假?
  • 停止对这类问题投反对票!这里的答案和解释可能对初学者仍然很有价值。
  • @Leonardo 公平地说,以目前的形式,这一个糟糕的问题(对不起,OP!)。它从一个没有根据、不合理和无法解释的错误假设开始,并抛出几个误解而没有抓住重点。我同意一个相关的问题(“什么值被认为是true,为什么?”)值得一问。我认为这里的反对票是因为这正是没有问的。

标签: perl boolean


【解决方案1】:

每个非零整数都等于true。 0 总是false

【讨论】:

  • 这些答案是同义反复的。我不是在问这是否属实,我可以看到。问题是为什么这是真的。我在发布之前查看了几篇文章,实际上我没有提到这个事实。通常给出的例子都是正整数。
  • 11 upvotes.. =) 真正简单的答案会带来最大的声誉奖励。
  • @shigeta “我看了几篇文章....实际上没有提到这个事实我可以看到。”这是一个常见的初学者错误:在错误的地方寻找答案。阅读 Perl 附带的 Perl 文档。 perldoc.perl.org/perlsyn.html#Truth-and-Falsehood
  • @shigeta - 因为拉里早早说过。
  • @reinierpost,这个问题有些语无伦次,或者充其量是模棱两可的。此外,我会挑战 OP 以找到一种单一的编程语言,其中问题中的最后一个示例不成立。
【解决方案2】:

如果有的话,可以说-11 更可能为真,因为-1 (111..111b) 是零的按位否定(000..000b)。 BASIC 和 GW-BASIC 在需要返回真值时使用 -1。

不管怎样,Perl 认为表示“空”或“无”的值是错误的。大多数语言都有类似的观点。具体来说,整数零、浮点零、字符串零、空字符串和undef都是假的。

这是documented,尽管文档措辞不佳。 (它将() 列为假值,但没有这样的值。)

除了一致性之外,采用这种方法也非常有用。例如,它允许一个人使用

if (@x)

而不是

if (@x != 0)

【讨论】:

  • 在列表上下文中,空列表有一个值,比较 if (($x) = (undef)) { #trueif (($x) = ()) { #false。在这两种情况下,$x 都设置为 undef,但表达式的真实性取决于列表中元素的数量,而不是这些元素的值。
  • @Ven'Tatsu,不,没有。您发布的代码测试的是赋值的返回值,而不是() 的返回值。
  • @Ven'Tatsu,如果您好奇,标量上下文中的列表赋值返回 RHS 返回的元素数。例如say scalar( ($x)=(4,5) ); 打印 2say scalar( ($x)=() ); 打印 0。)
【解决方案3】:

来自perldoc perlsyn (Truth and Falsehood)

数字 0、字符串 '0' 和 '' 、空列表 () 和 undef 在布尔上下文中都是错误的。所有其他值都为真。

-1 被认为是真的。

【讨论】:

  • 我一直认为,在布尔上下文中测试列表时,我实际上是在标量上下文中隐式测试它,当它为空时给出零,因此是错误的。列表具有没有首先获得标量处理的布尔上下文评估,这真的是真的吗?
  • 这没有回答问题。
  • @Joel:更可能的是,只是提到了空列表以避免混淆。在标量上下文中,一个空数组的计算结果为0(元素的数量),一个空列表的计算结果为undef(它的最后一个元素),这两者都已经是假的,不需要任何特殊情况的逻辑来处理它。
  • @reinierpost - 问题陈述“为什么 Perl 认为 -1 是真的”,而这个答案说“只有 a、b 和 c 是真的,而其他一切都是假的。” 蕴涵使这个答案成为一个完美的有效答案。
  • 我知道计算机极客对为什么会提出问题有疑问,并且只会学习有关物质含义的知识 - 我自己就是其中之一。但它们确实是不同的东西。
【解决方案4】:

问题是'为什么 perl 认为 -1 是真的?'.

答案是当 perl 被开发出来时,它决定某些值会被评估为 false。它们是:

  • 0
  • 未定义
  • ''(空字符串)

对于为什么,我只能想到一个合适的答案。它就是这样设计的。

【讨论】:

    【解决方案5】:

    只有 0 整数被认为是假的。任何其他非零整数都被认为是真的。

    【讨论】:

    • 不正确。 "" 返回的东西既不为零也不为真。
    【解决方案6】:

    任何整数 0 为真。 0 总是假的。

    【讨论】:

    • 零但真实:perl -E 'say "0e0" ? "True" : "False"' 必须用一种在字符串和数字之间没有严格类型系统的语言进行区分。 0e0 可以是一个数字,它可以是一个字符串(甚至计算为零),它可以是一个真正的字符串(因为 e)。偶尔会引起混淆的一个小问题。
    • @DavidO,是的,但 "0e0" 不返回 CS 意义上的整数。
    【解决方案7】:

    Perl 从 awkC 获取了这种行为。

    为什么C会解释here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-29
      • 2011-07-16
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      • 1970-01-01
      相关资源
      最近更新 更多