【发布时间】:2013-06-25 17:21:05
【问题描述】:
以下两个 Perl 变量声明有什么区别?
my $foo = 'bar' if 0;
my $baz;
$baz = 'qux' if 0;
当它们出现在循环的顶部时,差异是显着的。例如:
use warnings;
use strict;
foreach my $n (0,1){
my $foo = 'bar' if 0;
print defined $foo ? "defined\n" : "undefined\n";
$foo = 'bar';
print defined $foo ? "defined\n" : "undefined\n";
}
print "==\n";
foreach my $m (0,1){
my $baz;
$baz = 'qux' if 0;
print defined $baz ? "defined\n" : "undefined\n";
$baz = 'qux';
print defined $baz ? "defined\n" : "undefined\n";
}
结果
undefined
defined
defined
defined
==
undefined
defined
undefined
defined
似乎if 0 失败了,所以foo 永远不会重新初始化为undef。在这种情况下,它首先是如何声明的?
【问题讨论】:
-
perl -MO=Deparse yourfile将那些if 0行打印为'???';,并且重新编译的输出因缺少明确的包名称而死。所以我的结论是应该避免这样的结构,如果 Perl 有一个标准,这将被记录为行使未定义的行为等。但也许有人会提供 perlguts 的解释。 -
@Julian Fondren,
'???'只是意味着代码被优化掉了。 (例如,perl -MO=Deparse -e"1,2,3"和perl -MO=Deparse -le"print 'abc' if 0;"显示问号,即使两个 sn-ps 都是完全合法的。)解析显示my $x if 0的问号;如果my $x if 0;被允许,那将是一个错误,因为my具有编译时效果,尽管它的运行时效果确实被优化掉了。
标签: perl variables initialization declaration