В следующем объявлении анонимной подпрограммы Perl, похоже, анализирует его как косвенный вызов метода, а не как подпрограмму:
use 5.010;
use strict;
use warnings;
sub proxy {
my $new = shift;
say "creating proxy: $new";
sub :lvalue {
say "running proxy: $new";
tie my $ret, 'Some::Package', shift, $new;
$ret
}
}
say "before";
my $p1 = proxy '_value';
say "p1 declared: $p1";
my $p2 = proxy 'value';
say "p2 declared: $p2";
который печатает:
before
creating proxy: _value
running proxy: _value
Can't locate object method "TIESCALAR" via package "Some::Package" ...
Если return
или my $sub =
добавлено непосредственно перед sub :lvalue {...
, то все работает правильно и выдает:
before
creating proxy: _value
p1 declared: CODE(0x4c7e6c)
creating proxy: value
p2 declared: CODE(0x1ea85e4)
Это также работает, если атрибут :lvalue
удален из подпрограммы (но, конечно, это изменяет функциональность).
Итак, мой вопрос: почему это происходит? Это ошибка в Perl, связанная с атрибутами анонимных подпрограмм? По какой-то причине это ожидаемое поведение? Если это ошибка, она зарегистрирована?