attribute :: get () возвращает пустой список? - PullRequest
1 голос
/ 30 января 2012

Я никогда раньше не использовал атрибуты подпрограммы в perl, но бывает, что я нашел для них применение, поэтому я пытался понять, как я могу их использовать.В частности, мне нужно уметь во время выполнения выяснить, какие атрибуты имеет подпрограмма.У меня есть следующий тестовый код, но он выводит только пустой список:

use attributes;

sub MODIFY_CODE_ATTRIBUTES {
    my ($class,$code,@attrs) = @_;

    my $allowed = 'takeshash';
    my @bad = grep { $_ ne $allowed } @attrs;

    return @bad;
}
sub mylog : takeshash {

    my $params = shift;
    my $val = log($params->{'n'}) / log($params->{'base'});

    return $val;
}

use Data::Dumper;
print Dumper [attributes::get(\&mylog)];

Запуск Perl v5.12.4, я получаю:

$ perl temp.pl
$VAR1 = [];

1 Ответ

2 голосов
/ 30 января 2012

Похоже, что ваша проблема объясняется в разделе Доступные подпрограммы в документации атрибутов .Объяснение для подпрограммы get гласит:

Эта подпрограмма ожидает один параметр - ссылку на подпрограмму или переменную.Возвращает список атрибутов, который может быть пустым.Если переданы неверные аргументы, он использует die () (через Carp :: croak), чтобы вызвать фатальное исключение.Если он может найти подходящее имя пакета для поиска метода класса, он включит результаты вызова FETCH_type_ATTRIBUTES в свой список возврата, как описано в разделе Обработка атрибутов для конкретного пакета ниже. В противном случае будут возвращены только встроенные атрибуты.

Обратите внимание на последнее предложение, в котором я добавил акцент.Похоже, вам нужно добавить подпрограмму FETCH_CODE_ATTRIBUTES.

...