局部变量保留值

AKH*_*and 5 variables perl scope

所以,我只是追踪了一个可以在这个简单的子程序中演示的错误:

sub foo {
    my $bar = shift or die "Missing bar", # <--- not a semicolon
    my @items = ();
    push @items, $bar;
    return @items;
}
Run Code Online (Sandbox Code Playgroud)

显然,错误是子程序的第一行以逗号结尾.这有一些相当不寻常的后果,可以看出:

say foo(1); # 1
say foo(1); # 11
say foo(1); # 111
say foo(1); # 1111
Run Code Online (Sandbox Code Playgroud)

现在,我知道这不是语法错误,因为逗号运算符的工作原理.据我所知,@items没有设定,()因为or没有达到右侧.我的问题是,如何my在子程序内部声明的变量允许数据在子程序调用之间持续存在?看起来好像my变成了our某种程度.

mob*_*mob 5

B::Deparse 在这样的练习中是非常宝贵的:

$ perl -MO=Deparse 31191808.pl
sub foo {
    die 'Missing bar', my(@items) = () unless my $bar = shift @_;
    push @items, $bar;
    return @items;
}
Run Code Online (Sandbox Code Playgroud)

这使得它成为my $var if 0技巧/错误/好奇心的变体.它的作用是创建一个词法但静态的变量,每次foo调用时都不会重新初始化.