当我的()是有条件的时候会发生什么?

Mar*_*las 16 perl

比较使用 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)

  • "my"确实有你所说的运行时效果,但你没有提到它是什么![它在堆栈上放置一个指令以清除范围退出时的变量,然后它将var作为左值返回.]好吧,它可能是最好的,你没有提到它.:) (4认同)

Dav*_*man 8

暴民的答案是对当前发生的事情(以及为什么)的一个很好的解释,但不要忘记perldoc perlsyn告诉我们:

注意:未定义 a my,stateour使用语句修饰符条件或循环结构(例如my $x if ...)修改的行为.变量的值可以是 任何先前分配的值,或者可能是任何其他值.不要依赖它.perl的未来版本可能会与您尝试使用的perl版本有所不同.这里是龙.myundef

在未来的Perl版本中,不要指望该结果或其解释仍然存在.(虽然它可能会.)