【问题标题】:Perl : why I can't print !$num? when num is 1, it cannot print 0 [duplicate]Perl:为什么我不能打印!$num?当 num 为 1 时,它不能打印 0 [重复]
【发布时间】:2014-09-24 18:42:46
【问题描述】:
print !$num;  

当 $num 为 1 时,我希望看到 0。但是,没有打印任何内容。为什么?感谢您的任何评论。

这是我尝试的一些测试。这与我的问题一致。

print 1;     # 1
print 0;     # 0
print !1;    # (nothing)
print !0;    # 1
print !1 == 0;  # 1

迈克尔

【问题讨论】:

    标签: perl


    【解决方案1】:

    Perl 中的“false”布尔值是特殊值,当作为字符串计算时,它被视为"",但在数字上下文中,它被视为0

    这就是为什么在打印否定的真值时,您会看到空字符串:

    $ perl -MData::Dump -e 'dd !1'
    ""
    

    要查看值0,您必须在数字上下文中使用它。您可以通过简单地将 0 添加到值来做到这一点:

    $ perl -MData::Dump -e 'dd 0 + !1'
    0
    

    有关布尔值的更多信息,请查看perldata - Scalar Values

    【讨论】:

    • Re "Perl 中默认的“false”布尔值是空字符串 ''"。不是,不是。这是一个包含0 和空字符串的双重变量。 perl -wE'say 0+!1; say 0+""' 只对后一个语句发出警告。
    • 是的,我知道这在技术上是正确的。但是,我不确定如何用初学者的语言来构建它。我会考虑再回来,或者随时帮我一把。
    • 我认为欺骗目标的底部answer 很好地解释了这一点,尽管它有点长。特别是最后的部分:“总之,你没有得到任何东西,你没有得到一个空字符串,你没有得到零。你得到一个既是空字符串又是 0 的变量同一时间。”
    • "一个值,当被视为字符串时为空字符串,当被视为数字时为零"
    【解决方案2】:

    根据docs

    数字 0、字符串 '0' 和 "" 、空列表 () 和 undef 在布尔上下文中都是错误的。所有其他值都为真。 对真实值的否定!或不返回一个特殊的假值。 当评估为字符串时,它被视为 "" ,但作为数字,它 被视为 0。大多数返回 true 或 false 的 Perl 运算符的行为 这边。

    print!1 评估为字符串,因此它被视为 ""


    如果您在数字上下文中评估!1,它将被视为0

    $ perl -MData::Dumper -e'print Dumper !1+!1'
    $VAR1 = 0;
    

    【讨论】:

      【解决方案3】:

      一般意义上,true 有多种值,false 有多种值。所以not true 在布尔上下文中是有效的,但是当你print 它时会模棱两可。

      【讨论】: