2010-04-16 21 views
4

比方說,我有一個像下面這樣的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. 

+1

有幾種方法可以在Perl中定義常量,每個方法都有不同的好壞點。在這種情況下你用常量解決什麼問題? – 2010-04-16 21:31:15

回答

12

這通常會爲你工作:

%{DOG()} 

常量一般都只是替補。但對於緩解(以及相貌),您可能更喜歡使用Readonly,正如PBP中所建議的那樣。

Readonly::Hash my %DOG => 
    (Lassie => 'collie' 
    , Benji => 'mutt' 
    , Scooby => 'great dane' 
    , Goofy => '???' 
    ); 
+0

完美 - 並有很好的額外信息。謝謝! – makenai 2010-04-17 00:52:27

-1

力成列表上下文...

warn keys(%{(DOGS)}); 
+0

-1貨物崇拜。它不是強制列表上下文,而是破壞哈希鍵名Perl魔法。 – 2010-04-17 15:00:59

5

的Perldoc是你的朋友:perldoc constants

可以惹上麻煩,如果你在 自動報價裸字(如 真正用於任何子程序調用)上下文使用 常量。對於 示例, 您不能說$ hash {CONSTANT},因爲「CONSTANT」將被解釋爲字符串 。使用$ hash {CONSTANT()}或 $ hash {+ CONSTANT}來防止文字引用機制裸機。同樣,由於「=>」運營商在其左側立即引用了一個裸字 , 「CONSTANT() =>'value'」(或簡單地使用逗號代替大箭頭) 而不是「CONSTANT =>'value'」。

warn keys %{DOG()}應該這樣做。

+0

很高興知道。謝謝! – makenai 2010-04-17 00:53:48