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

nik*_*hta 4 perl logical-operators

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

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

1  
0Zero
Run Code Online (Sandbox Code Playgroud)

但它打印出来

1  
zero
Run Code Online (Sandbox Code Playgroud)

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

小智 5

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

因此,Perl中的错误值与键入更强的语言有所不同(强调我加入):

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

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

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

$d=!$b+0;
print $d;
Run Code Online (Sandbox Code Playgroud)

您可以使用sprintfprintf显式控制显示:

printf '%d', $d;
Run Code Online (Sandbox Code Playgroud)

或者您可以使用int:

print int $d;
Run Code Online (Sandbox Code Playgroud)

(注意:这一切看起来有点复杂.但它的设计是为了让语言能够做你想要的,而且你不必考虑它.而且通常情况确实如此.只有你偶尔出现的边缘情况需要做除Perl默认行为之外的其他事情.)

  • 因为`$ d`包含一个空字符串,而不是零.强制数字解释的方法是说'0 + $ d`. (2认同)