如何取消引用hashref常量?

时间:2010-04-16 20:32:53

标签: perl

假设我有一个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.

我做错了什么?

3 个答案:

答案 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)});