Почему это объявление подпрограммы anon анализируется как метод косвенного объекта в Perl?

В следующем объявлении анонимной подпрограммы 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 с атрибутами анонимных подпрограмм? Это по какой-то причине ожидаемое поведение? Если это ошибка, зарегистрирована ли она?

9
задан Eric Strom 23 January 2011 в 20:02
поделиться