比较使用 perl -w -Mstrict
:
# case Alpha
print $c;
Run Code Online (Sandbox Code Playgroud)
...
# case Bravo
if (0) {
my $c = 1;
}
print $c;
Run Code Online (Sandbox Code Playgroud)
...
# case Charlie
my $c = 1 if 0;
print $c;
Run Code Online (Sandbox Code Playgroud)
Alpha
并且Bravo
都抱怨全球符号没有明确的包名,这是可以预期的.但是Charlie
没有给出相同的警告,只是说这个值是未初始化的,这有点像:
# case Delta
my $c;
print $c;
Run Code Online (Sandbox Code Playgroud)
引擎盖下究竟发生了什么?(即使不应该为生产代码编写类似的东西)
mob*_*mob 15
您可以将my
声明视为在编译时和运行时具有操作.在编译时,my
声明告诉编译器记下符号是否存在,并且在当前词法范围结束之前可用.该声明中的符号的转让或其他用途将在运行时进行.
所以你的榜样
my $c = 1 if 0;
Run Code Online (Sandbox Code Playgroud)
就好像
my $c; # compile-time declaration, initialized to undef
$c = 1 if 0; # runtime -- as written has no effect
Run Code Online (Sandbox Code Playgroud)
请注意,这种编译时/运行时区别允许您编写这样的代码.
my $DEBUG; # lexical scope variable declared at compile-time
BEGIN {
$DEBUG = $ENV{MY_DEBUG}; # statement executed at compile-time
};
Run Code Online (Sandbox Code Playgroud)
现在你能猜出这个程序的输出是什么吗?
my $c = 3;
BEGIN {
print "\$c is $c\n";
$c = 4;
}
print "\$c is $c\n";
Run Code Online (Sandbox Code Playgroud)
暴民的答案是对当前发生的事情(以及为什么)的一个很好的解释,但不要忘记perldoc perlsyn
告诉我们:
注意:未定义 a
my
,state
或our
使用语句修饰符条件或循环结构(例如my $x if ...
)修改的行为.变量的值可以是 任何先前分配的值,或者可能是任何其他值.不要依赖它.perl的未来版本可能会与您尝试使用的perl版本有所不同.这里是龙.my
undef
在未来的Perl版本中,不要指望该结果或其解释仍然存在.(虽然它可能会.)
归档时间: |
|
查看次数: |
803 次 |
最近记录: |