我在 Perl 中试过这个例子。有人可以解释为什么这是真的吗?
if (defined sdf) { print "true"; }
它打印true
。
sdf 可以是任何名称。
此外,如果定义了 sdf 函数并返回 0,则它不会打印任何内容。
print (sdf);
不打印 sdf 字符串,但
if (sdf eq "sdf")
{
print "true";
}
打印真实。
如果 sdf 是字符串,则相关问题仍然存在。什么不是打印出来的?
sdf
是一句空话。
perl -Mstrict -e "print qq{defined\n} if defined sdf"
在 -e 第 1 行使用“strict subs”时不允许使用裸词“sdf”。 由于编译错误,-e 的执行中止。
更多乐趣,请尝试
perl -Mstrict -e "print sdf => qq{\n}"
请参阅严格地说 use strict:
use strict 的 subs 方面禁止将“裸词”解释为文本字符串。默认情况下,如果不是内置关键字或之前看到的子例程定义的 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()
函数的调用,返回与默认值等效的$_
八进制数。
更正:(感谢@ysth)
E:\Home> perl -we "打印 sdf" 未加引号的字符串“sdf”可能与 -e 第 1 行的未来保留字冲突。 名称“main::sdf”仅使用一次:-e 第 1 行可能有错字。 print() 在 -e 第 1 行的未打开文件句柄 sdf 上。
如果print
在间接对象槽中提供了裸字,则将其作为要打印到的文件句柄。由于没有提供其他参数,print
默认打印$_
到 filehandle sdf
。由于sdf
尚未打开,因此失败。如果您在没有警告的情况下运行它,您将看不到任何输出。另请注意:
E:\Home> perl -MO=Deparse -e "打印 sdf" 打印 sdf $_;
作为这一观察的确认。另请注意:
E:\Home> perl -e "打印 asdfg, sadjkfsh" -e 第 1 行的文件句柄后不允许有逗号。
E:\Home> perl -e "打印 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
你可能想看看这篇关于 Perl 中真理的文章:什么是真理?
defined
如果表达式的值不是未定义的值,则返回 true。
除非参数中传递的值未定义,否则定义的函数返回 true。这对于将包含 0 或 "" 的变量与刚刚出现的变量区分开来很有用。