任何人都可以向我解释perl程序的行为

时间:2014-03-28 05:15:29

标签: perl logical-operators

$a="";
$b="n";
$c = !$a;
$d = !$b;
print $c , "\n" , $d;
if($d == 0){
    print "zero";
}

我编写了这个perl程序,我希望输出如下

1  
0Zero

但打印

1  
zero

任何人都可以解释我为什么会那样??

4 个答案:

答案 0 :(得分:5)

Perl中的变量被视为数字或字符串,具体取决于上下文。如果您在分配时没有将某些内容视为数字,Perl会在您打印时将其视为字符串。

因此,错误的值是a bit different in Perl than in languages with stronger typing(我强调的是):

  

数字0,字符串'0'和“”,空列表()和undef   在布尔上下文中都是false。所有其他值都是真的。   否定真正的价值!或不返回特殊的假值。   当评估为字符串时,它被视为“”,但作为数字,它被视为   被视为0。大多数返回true或false的Perl运算符都表现出来   这样。

所以,这里的问题是!逻辑运算符而不是算术运算符。因此,它返回一个逻辑错误值,该值根据上下文以不同方式表示。

如果您想确保将某些内容视为数字,您可以选择一些选项。您可以执行算术运算,这将使Perl将结果视为数字:

$d=!$b+0;
print $d;

您可以使用sprintfprintf明确控制显示:

printf '%d', $d;

或者您可以使用int

print int $d;

(注意:这一切看起来有点复杂。但它的设计是为了让语言能够做到你想要的,而且你不必考虑它。通常它会这样。只有偶尔的边缘您需要执行除Perl默认行为之外的其他操作的情况。)

答案 1 :(得分:2)

!$b计算为空字符串'',因为在print()"$bool"或其他字符串操作进行字符串化时,false值不表示为零。

$a="";
$b="n";
$c = !$a;
$d = !$b;
print $c , "\n" , $d;
if($d == 0){
    print "zero";
}

use Data::Dumper;
print Dumper {
  '$a' => $a,
  '$b' => $b,
  '$c' => $c,
  '$d' => $d,
  '$d == 0' => $d == 0,
};

输出

$VAR1 = {
      '$d == 0' => 1,  # boolean true
      '$b' => 'n',
      '$d' => '',      # boolean false
      '$c' => 1,
      '$a' => ''
    };

答案 2 :(得分:2)

perlsyn, under Truth and Falsehood中你读了

  

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

这就是您的体验。 $a为false值,因此!$a分配给$c,会变为真值,因此打印为1$b是真值,因此分配给!$b的{​​{1}}会成为特殊的假值。在print语句($d)中,它在字符串上下文中进行计算,因此将打印空字符串。 if语句(print $c , "\n" , $d;)在数字上下文中对其进行评估,因此它是$d == 0,因此会打印0

答案 3 :(得分:1)

返回布尔值的!等Perl运算符返回false的特殊值:在字符串上下文中使用时为“”,在数值上下文中使用时为0。

所以当你打印时,它是“”,而不是“0”。但是如果你试图将它用作数字,它就不会像“”那样发出警告。比较:

perl -wle'$false = !1; print "string: ", $false, " number: ", 0+$false'
string:  number: 0

perl -wle'$empty = ""; print "string: ", $empty, " number: ", 0+$empty'
Argument "" isn't numeric in addition (+) at -e line 1.
string:  number: 0