ale*_*kuk 10 perl scope global-variables special-variables
我想在我的无限二进制函数中使用$a和$b变量,就像它完成sort {$a <=> $b} (1, 2, 3)但我无法弄清楚为什么代码
#!/usr/bin/env perl
use strict;
use warnings;
Foo::Bar(sub { $a + $b });
package Foo;
sub Bar {
my ($function) = @_;
for my $i (1, 2, 3) {
local ($a, $b) = ($i, $i);
print $function->() . "\n";
}
}
Run Code Online (Sandbox Code Playgroud)
不起作用.而
#!/usr/bin/env perl
use strict;
use warnings;
Foo::Bar(sub { $_ });
package Foo;
sub Bar {
my ($function) = @_;
for my $i (1, 2, 3) {
local $_ = $i;
print $function->() . "\n";
}
}
Run Code Online (Sandbox Code Playgroud)
工作良好.
我究竟做错了什么?
fri*_*edo 14
$a并且$b是特殊的包变量.你是Foo::Bar在你的main包内打电话,所以你需要设置$main::a并$main::b让它工作.您可以使用caller获取调用包的名称.这应该工作:
#!/usr/bin/env perl
use strict;
use warnings;
Foo::Bar(sub { $a + $b });
package Foo;
sub Bar {
my ($function) = @_;
my $pkg = caller;
for my $i (1, 2, 3) {
no strict 'refs';
local *{ $pkg . '::a' } = \$i;
local *{ $pkg . '::b' } = \$i;
print $function->() . "\n";
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2137 次 |
| 最近记录: |