为什么定义自卫队返回真的在这Perl例子吗?
题
我尝试过这种例子在Perl。有人可以解释为什么是真的吗?
if (defined sdf) { print "true"; }
它打印 true
.
自卫队可以任何名称。
此外,如果没有自卫队功能的定义和返回0,则它不打印什么。
print (sdf);
不打印sdf串但是
if (sdf eq "sdf")
{
print "true";
}
印真实的。
相关的问题仍然是如果自卫队是一串。什么是它不打印打印吗?
解决方案
sdf
是裸词。
perl -Mstrict -e "print qq{defined\n} if defined sdf"
Bareword "sdf" not allowed while "strict subs" in use at -e line 1. Execution of -e aborted due to compilation errors.
有关更多的乐趣,尝试
perl -Mstrict -e "print sdf => qq{\n}"
请参阅严格地说大约使用严格:
使用严格的潜艇方面禁用的``裸单词“”作为文本串解释。默认情况下,一个Perl标识符(字母,数字和下划线序列,不以数字开头,除非它是完全数字),不另外内置的关键字或先前看到的子程序定义被视为引用的文本字符串:
@daynames = (sun, mon, tue, wed, thu, fri, sat);
然而,这被认为是一种危险的做法,因为晦涩的错误可能会导致:
@monthnames = (jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec);
你能发现的bug?是的,第10项不是字符串“月”,而是调用内置
oct()
函数,返回八进制数对待默认$_
的数字等效。
<强>修正:强>(感谢@ysth)
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.
如果一个裸词被提供在间接对象槽print
,它被作为一个文件句柄打印到。由于没有其他提供参数,print
默认打印$_
到文件句柄sdf
。由于sdf
没有打开,它会失败。如果你运行这个没有警告,你看不到任何输出。还注意:
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
后者打印两个字符串如果它们仅由“字”的字符,除去第一个参数的文件句柄解释,因为=>
自动引述在LHS字符串。
所有这些实施例表明,使用裸字导致许多惊喜。应该use strict
以避免这样的情况。
其他提示
这是一个 “裸词”。如果它被允许,它具有"sdf"
的值,因此没有未定义的。
例不是特别的:
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
没有这些相当于 undef
这是什么 defined
检查。
你可能想看看这篇文章在真相Perl: 什么是真理?
defined
如果表达式具有比未定义的值以外的值,则返回true。
所定义的函数返回true,除非在参数传递的值是未定义的。这是从含有区分0或“”从刚才使眼色进入存在的变量的变量是有用的。