2012-01-30 4 views
1

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

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 = []; 

ответ

2

Похоже, ваша проблема объясняется в разделе о Available Subroutines в attributes documentation. Объяснение get подпрограммой говорит:

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

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

+0

Спасибо, я смог понять это сам RTFM, но по какой-то причине не смог получить переполнение стека, чтобы опубликовать мое решение. –