如何取消引用hashref常量?

mak*_*nai 5 perl

假设我有一个hashref常量,如下所示:

use constant DOGS => {
    Lassie => 'collie',
    Benji  => 'mutt',
    Scooby => 'great dane',
    Goofy  => '???'
};
Run Code Online (Sandbox Code Playgroud)

我怎样才能正确地取消引用它来说出来......它们的关键是什么?

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)
Run Code Online (Sandbox Code Playgroud)

以下是我能够使它工作的唯一方法:

my $dogs = DOGS;
warn keys( %$dogs ); # LassieBenjiGoofyScooby at untitled line 15.
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Axe*_*man 14

这通常适合您:

%{DOG()}
Run Code Online (Sandbox Code Playgroud)

常数通常只是潜艇.但是为了方便(和外观),您可能更喜欢使用Readonly,如PBP中所建议的那样.

Readonly::Hash my %DOG => 
    ( Lassie => 'collie'
    , Benji  => 'mutt'
    , Scooby => 'great dane'
    , Goofy  => '???'
    );
Run Code Online (Sandbox Code Playgroud)


Log*_*gan 5

Perldoc是你的朋友: perldoc constants

如果在自动引用裸字的上下文中使用常量,则可能会遇到麻烦(对于任何子例程调用都是如此).例如,您不能说$ hash {CONSTANT}因为"CONSTANT"将被解释为字符串.使用$ {哈希常数()}或$ {哈希值+常数冲防止裸词引用机制在踢.同样,由于"=>"运算符立即引用了裸词在它的左边,你不得不说"常数()=>'value'"(或简单地用逗号代替大箭头)而不是"CONSTANT =>'value'".

warn keys %{DOG()} 应该做的伎俩.