3

我在 Perl 中试过这个例子。有人可以解释为什么这是真的吗?

  if (defined sdf)  {   print "true";  }

它打印true

sdf 可以是任何名称。

此外,如果定义了 sdf 函数并返回 0,则它不会打印任何内容。

print (sdf);不打印 sdf 字符串,但

if (sdf eq "sdf")
{
 print "true";
}

打印真实。

如果 sdf 是字符串,则相关问题仍然存在。什么不是打印出来的?

4

5 回答 5

10

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避免这种情况。

于 2009-10-29T22:41:01.043 回答
5

这是一个“裸词”。如果允许,它的值为"sdf",因此不是未定义的。

于 2009-10-29T22:40:50.720 回答
4

这个例子并不特别:

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 中真理的文章:什么是真理?

于 2009-10-29T22:39:55.150 回答
3

defined如果表达式的值不是未定义的值,则返回 true。

于 2009-10-29T22:39:54.540 回答
0

除非参数中传递的值未定义,否则定义的函数返回 true。这对于将包含 0 或 "" 的变量与刚刚出现的变量区分开来很有用。

于 2009-10-29T22:40:54.387 回答