为什么在这个Perl示例中定义的sdf返回true?

时间:2009-10-29 22:36:29

标签: perl strict bareword

我在Perl中尝试过这个例子。有人可以解释为什么会这样吗?

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

打印true

sdf可以是任何名称。

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

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

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

打印为真。

如果sdf是一个字符串,相关的问题仍然存在。什么不是印刷品?

5 个答案:

答案 0 :(得分:10)

sdfbareword

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}"

请参阅Strictly speaking about use strict

  

use strict的子方面禁止将“裸字”解释为文本字符串。默认情况下,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 "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上的字符串,如果它们仅由'word'字符组成,则删除第一个参数的文件句柄解释。

所有这些例子表明,使用裸字会带来许多惊喜。你应该use strict来避免这种情况。

答案 1 :(得分:5)

这是“bareword”。如果允许,则其值为"sdf",因此未定义。

答案 2 :(得分: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中查看有关真相的文章:What is Truth?

答案 3 :(得分:3)

如果表达式的值不是未定义的值,则

defined返回true。

答案 4 :(得分:0)

定义的函数返回true,除非参数中传递的值未定义。这可以区分包含0或“”的变量和刚刚存在的变量。