为什么在这个Perl示例中定义的sdf返回true?
我在Perl中尝试了这个示例。有人能解释为什么这是真的吗为什么在这个Perl示例中定义的sdf返回true?,perl,strict,bareword,Perl,Strict,Bareword,我在Perl中尝试了这个示例。有人能解释为什么这是真的吗 if (defined sdf) { print "true"; } 它打印true 自卫队可以是任何名字 此外,如果定义了sdf函数并返回0,则不会打印任何内容 打印(sdf)不打印sdf字符串,但 if (sdf eq "sdf") { print "true"; } 这是真的 如果sdf是字符串,则相关问题仍然存在。什么不是通过打印打印打印的?如果表达式的值不是未定义的值,则返回true。该示例并不特殊: tele
if (defined sdf) { print "true"; }
它打印true
自卫队可以是任何名字
此外,如果定义了sdf函数并返回0,则不会打印任何内容
打印(sdf)代码>不打印sdf字符串,但
if (sdf eq "sdf")
{
print "true";
}
这是真的
如果sdf是字符串,则相关问题仍然存在。什么不是通过打印打印打印的?如果表达式的值不是未定义的值,则返回true。该示例并不特殊:
telemachus ~ $ perl -e 'if (defined sdf) { print "True\n" };'
True
telemachus ~ $ perl -e 'if (defined abc) { print "True\n" };'
True
telemachus ~ $ perl -e 'if (defined ccc) { print "True\n" };'
True
telemachus ~ $ perl -e 'if (defined 8) { print "True\n" };'
True
这些都不等同于检查的内容
您可能想查看这篇关于Perl中真理的文章:这是一个“”。如果允许,它的值为“sdf”
,因此不是未定义的。除非参数中传递的值未定义,否则已定义的函数将返回true。这对于区分包含0或“”的变量和刚刚存在的变量非常有用。sdf
是一个简单的变量
见:
use strict的SUB方面禁止将“裸词”解释为文本字符串。默认情况下,不是内置关键字或以前看到的子例程定义的Perl标识符(字母、数字和下划线序列,除非完全是数字,否则不以数字开头)将被视为带引号的文本字符串:
@daynames = (sun, mon, tue, wed, thu, fri, sat);
但是,这被认为是一种危险的做法,因为模糊的错误可能会导致:
@monthnames = (jan, feb, mar, apr, may, jun,
jul, aug, sep, oct, nov, dec);
你能发现虫子吗?是的,第10个条目不是字符串“oct”,而是对内置的oct()
函数的调用,返回默认的$\uu
作为八进制数处理的数字等价物
更正:(谢谢@ysth)
作为对这一观察的确认。另请注意:
E:\Home> perl -MO=Deparse -e "print sdf"
print sdf $_;
E:\Home> perl -e "print asdfg, sadjkfsh"
No comma allowed after filehandle at -e line 1.
E:\Home>perl-E“打印asdfg,sadjkfsh”
在-e第1行的filehandle之后不允许使用逗号。
E:\Home>perl-E“打印asdfg=>sadjkfsh”
asdfgsadjkfsh
后者打印两个字符串,因为如果LHS上的字符串仅由“word”字符组成,则=>
会自动引用它们,从而删除第一个参数的filehandle解释
所有这些例子都表明使用空话会带来很多惊喜。你应该使用strict
来避免这种情况。实际上,0
是false
但是定义了。检查它:perl-e'if(定义为0){print“True\n”};'
你的最后一个例子,8
,在一个关键的方面与其他例子不同。@Sinan:是的,这是一个数字。解释一下sdf
是一个空话是有帮助的,但我的重点是说sdf
没有什么神奇之处@Sinan:谢谢你。我一直认为空字符串是未定义的。这是我的错误,我会纠正它。但是,如果您使用sdf
,使用strict
将不允许您的程序编译,但是,当然,8
不会出现问题。;-)@余震:我已经更新了我的答案,以解决您提出的上一个问题。@SinanÜnür:因为print接受一个间接对象,而不是因为print调用提供了列表上下文。
@monthnames = (jan, feb, mar, apr, may, jun,
jul, aug, sep, oct, nov, dec);
E:\Home> perl -we "print sdf"
Unquoted string "sdf" may clash with future reserved word at -e line 1.
Name "main::sdf" used only once: possible typo at -e line 1.
print() on unopened filehandle sdf at -e line 1.
E:\Home> perl -MO=Deparse -e "print sdf"
print sdf $_;
E:\Home> perl -e "print asdfg, sadjkfsh"
No comma allowed after filehandle at -e line 1.
E:\Home> perl -e "print asdfg => sadjkfsh"
asdfgsadjkfsh