首先,我来自C,Java,Python背景.最近,我开始为我的新工作学习Perl,我很好奇'0'(0-string)是假的.
我已经读过这个特殊的行为是为什么Perl必须有<>操作员来读取文件的原因所以现在感觉更像是一个设计缺陷.但是,我也知道Perl是一种成熟的语言,我猜这种行为有它的用途,否则它很久以前就已经修复了.
那么在什么情况下'0'= false是有用的?
yst*_*sth 11
如果您读到它与之有关<>,那么您正在阅读不良来源; 我无法想象这个说法来自哪里.
'0'是错误的,因为几乎所有perl都不区分以数字形式和字符串形式存储的数字; 在布尔测试中执行此操作将针对此粒度运行.
在语言(Python,Javascript?)中,'0'为真,我觉得很奇怪''是假的; 为什么要为一个字符串而不是另一个字符串进行异常?
Perl没有明确的类型,它对类型的解释高度依赖于上下文.例如:
$a = "2b";
$b = "3a";
$c = $a + $b;
print $c;
Run Code Online (Sandbox Code Playgroud)
收益率5.
另一方面...
$a = "b2";
$b = "3a";
$c = $a + $b;
print $c;
Run Code Online (Sandbox Code Playgroud)
收益率3.
和...
$a = "b2";
$b = "3a";
$c = $a.$b;
print $c;
Run Code Online (Sandbox Code Playgroud)
产量b23a
所以"'0'(字符串)"不是字符串,数字或bool,直到你使用它,然后它可以是由它的使用决定的任何东西.在您尝试操作之前,不会确定类型.然后Perl评估上下文以努力实现您的意图并采取相应行动.这是一个功能,以及为什么在Perl中有许多方法可以做.它当然可以导致大量令人困惑的代码,但非常适合1-liners,混淆和Perl高尔夫.
Perl 窃取继承了许多其他语言的功能,包括C,awk,Bourne shell和许多其他语言.
在C中,任何0值都为false,任何非零值都为true.Perl只使用相同的语义.
事实上,Perl在标量或布尔上下文中可以使用的内容比C更多,特别是字符串,这意味着Perl有多个错误值.
使整数为0false对C程序员来说非常有意义.将空字符串""设为false也是有道理的.由于Perl可以将相同的标量视为数字或字符串,因此将字符串设为"0"false几乎是不可避免的.
例如:
$x = 2;
$x -= 2;
print "x = $x\n"; # prints "x = 0"
if ($x) {
print "A C programmer would be surprised to see this\n";
}
$x = "";
$x .= chr(48);
# Now $x eq "0", a string value that was built without reference to
# the number zero -- but it's nearly the same thing as the number 0.
print "\$x = $x\n"; # pritn "x = 0"
if ($x) {
print "A C programmer would be equally surprised to see this\n";
}
Run Code Online (Sandbox Code Playgroud)
如果从头开始设计Perl而不借用其他语言的这么多特性,它可能会在字符串和数字之间做出更强的区分,而不是将它们组合在一起作为标量.鉴于这种假设的类Perl语言,很可能空字符串和数字0都是假的,但字符串"0"是真的 - 你需要一个显式的转换来从数字转换为0字符串"0".
但Perl就是这样.
理想情况下,内部存储格式在Perl中永远不应该重要.Zero为零是零,无论它是存储在IV,UV,NV,PV等中.
事实上,因为它可以,Perl将以可能让您感到惊讶的方式更改存储值的格式.如果string 0为true,则以下内容将打印为"true":
$x = 0;
print("$x\n");
if ($x) {
print("true\n");
} else {
print("false\n");
}
Run Code Online (Sandbox Code Playgroud)