如何在Perl子例程中使用$ a和$ b

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)

  • +1.我认为这是非常糟糕的做法. (9认同)
  • 确实如此.我怀疑OP并不真正知道他在做什么,而且用'sub {$ _ [0] + $ _ [1]}`和`$ function - >($ i,$ i)会更好. . (5认同)
  • 查看[List :: MoreUtils](http://p3rl.org/List::MoreUtils)的源代码,了解野外的一些例子 (3认同)