$a="";
$b="n";
$c = !$a;
$d = !$b;
print $c , "\n" , $d;
if($d == 0){
print "zero";
}
我编写了这个perl程序,我希望输出如下
1
0Zero
但打印
1
zero
任何人都可以解释我为什么会那样??
答案 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;
您可以使用sprintf
或printf
明确控制显示:
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