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

为什么在这个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

我在Perl中尝试了这个示例。有人能解释为什么这是真的吗

  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