Как я могу разыменовать hashref константу?

Скажем, у меня есть hashref константа как следующее:

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.

Что я делаю неправильно?

5
задан brian d foy 17 April 2010 в 12:55
поделиться

3 ответа

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

%{DOG()}

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

Readonly::Hash my %DOG => 
    ( Lassie => 'collie'
    , Benji  => 'mutt'
    , Scooby => 'great dane'
    , Goofy  => '???'
    );
14
ответ дан 18 December 2019 в 09:05
поделиться

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

warn keys(%{(DOGS)});
-1
ответ дан 18 December 2019 в 09:05
поделиться

Perldoc - ваш друг: константы perldoc

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

клавиши предупреждения% {DOG ()} должны помочь.

5
ответ дан 18 December 2019 в 09:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: