Ну, два других ответа - полуправы. Вот рабочее решение, которое на самом деле сортирует:
package Foo;
use strict;
use warnings;
sub sort {
my ($self, $sub) = @_;
my ($pkg) = caller;
my @x = qw(1 6 39 2 5);
print "@x\n";
{
no strict 'refs';
@x = sort {
local (${$pkg.'::a'}, ${$pkg.'::b'}) = ($a, $b);
$sub->();
} @x;
}
print "@x\n";
return;
}
package main;
use strict;
use warnings;
my $foo = {};
bless $foo, 'Foo';
$foo->sort(sub { $a <=> $b });
# 1 6 39 2 5
# 1 2 5 6 39
Предположительно, вы бы отсортировали некоторые данные, которые на самом деле являются частью объекта.
Вам нужна магия caller
, так что вы локализуете $a
и $b
в пакете вызывающего, где Perl собирается их искать. Он создает глобальные переменные, которые существуют только во время вызова этого подпрограммы.
Обратите внимание, что вы получите «имя, использованное только один раз» с warnings
; Я уверен, что есть некоторые обручи, которые вы можете перепрыгнуть, чтобы как-то избежать этого.