Как я могу разыменовать константу hashref? - PullRequest
5 голосов
/ 17 апреля 2010

Допустим, у меня есть константа хешфрейка, как показано ниже:

use constant DOGS => {
    Lassie => 'collie',
    Benji  => 'mutt',
    Scooby => 'great dane',
    Goofy  => '???'
};

Как я могу правильно разыменовать его, чтобы сказать ... они из него ключи?

warn ref DOGS; # HASH at untitled line 12.
warn keys( %{DOGS} ); # Warning: something's wrong (empty list)
warn keys( DOGS ); # Type of arg 1 to keys must be hash (not constant item)

Следующее - единственный способ заставить его работать:

my $dogs = DOGS;
warn keys( %$dogs ); # LassieBenjiGoofyScooby at untitled line 15.

Что я делаю не так?

Ответы [ 3 ]

14 голосов
/ 17 апреля 2010

Обычно это работает для вас:

%{DOG()}

Константы, как правило, просто слагаемые. Но для облегчения (и внешности) вы можете предпочесть использовать Readonly, как предлагается в PBP.

Readonly::Hash my %DOG => 
    ( Lassie => 'collie'
    , Benji  => 'mutt'
    , Scooby => 'great dane'
    , Goofy  => '???'
    );
5 голосов
/ 17 апреля 2010

Перлдок - твой друг: perldoc constants

Вы можете попасть в беду, если используете константы в контексте, который автоматически цитирует голые слова (как есть верно для любого вызова подпрограммы). За пример, Вы не можете сказать $ hash {CONSTANT}, потому что "CONSTANT" будет интерпретироваться как строка Используйте $ hash {CONSTANT ()} или $ hash {+ CONSTANT}, чтобы предотвратить механизм цитирования слова от удара. Точно так же, так как "=>" оператор сразу цитирует голое слово Слева вы должны сказать «КОНСТАНТА () => 'value' "(или просто используйте запятую вместо большой стрелки) вместо "CONSTANT => 'value'".

warn keys %{DOG()} должен добиться цели.

0 голосов
/ 17 апреля 2010

Заставить его в контекст списка ...

warn keys(%{(DOGS)});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...