Скажем, у меня есть 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.
Что я делаю неправильно?
Это обычно работает для вас:
%{DOG()}
Константы обычно являются просто подпрограммами. Но для простоты (и внешнего вида) вы можете предпочесть использовать Readonly
, как предлагается в PBP.
Readonly::Hash my %DOG =>
( Lassie => 'collie'
, Benji => 'mutt'
, Scooby => 'great dane'
, Goofy => '???'
);
Вставить в контекст списка ...
warn keys(%{(DOGS)});
Perldoc - ваш друг: константы perldoc
У вас могут возникнуть проблемы, если вы используете константы в контексте, который автоматически цитирует голые слова (как и {{1}) } true для любого вызова подпрограммы). Например, , вы не можете сказать $ hash {CONSTANT}, потому что "CONSTANT" будет интерпретироваться как строка. Используйте $ hash {CONSTANT ()} или $ hash {+ CONSTANT}, чтобы предотвратить срабатывание простого механизма цитирования слов - . Точно так же, поскольку "=>" оператор цитирует пустое слово сразу слева от него, вы должны сказать "CONSTANT () => 'value'" (или просто используйте запятую вместо большой стрелки ) вместо "CONSTANT => 'value'".
клавиши предупреждения% {DOG ()}
должны помочь.