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某种程度.
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调用时都不会重新初始化.
| 归档时间: |
|
| 查看次数: |
88 次 |
| 最近记录: |