假设我有一个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.
我做错了什么?
答案 0 :(得分:14)
这通常适合您:
%{DOG()}
常量通常只是潜艇。但对于 ease (和外观),您可能更喜欢使用PBP中建议的Readonly
。
Readonly::Hash my %DOG =>
( Lassie => 'collie'
, Benji => 'mutt'
, Scooby => 'great dane'
, Goofy => '???'
);
答案 1 :(得分:5)
Perldoc是你的朋友:perldoc constants
如果使用,可能会遇到麻烦 上下文中的常量 自动引用裸字(按原样) 对于任何子程序调用都是如此)。对于 例, 你不能说$ hash {CONSTANT}因为“CONSTANT”会被解释 作为一个字符串。使用$ hash {CONSTANT()}或 $ hash {+ CONSTANT}以防止裸 - 单词引用机制来自踢。同样,因为“=>” 运营商立即引用一条赤字 在它的左边,你必须说 “不变() => '价值'“(或简单地用逗号代替大箭头) 而不是“CONSTANT =>'value'”。
warn keys %{DOG()}
应该可以解决问题。
答案 2 :(得分:-1)
强制它进入列表上下文...
warn keys(%{(DOGS)});