2011-08-28 67 views
0

可能重複:
How do I create a hash of hashes in Perl?Perl的地圖繪製

我需要創造一些東西,是地圖的等效:名稱(字符串)映射日期(字符串/ int)以值,即地圖{string => map {string => value}}。 我應該如何在perl中進行操作? 以下代碼不起作用。

my %strtomap_; 
# given $str_, $date_, $val_ 
if (! exists $strtomap_ { $str_ }) 
{ 
my %new_map_date_to_val_ ; 
$new_map_date_to_val_{$date_} = $val_; 
$strtomap_ { $str_ } = %new_map_date_to_val_ ; 
} 
else 
{ 
$strtomap_ { $str_ } { $date_ } = $val_; 
} 
+2

有一個在這個標題爲其他人誰不知道的Perl可以使用不正確的術語「映射」來形容Perl的關聯數組(即哈希)下產生回答值。 –

+2

@明顯,不幸的是,由於'map'在Perl中有一個含義,這會導致比它的價值更多的混淆。 –

+0

@Joel:毫無疑問,如果有人繼續使用錯誤的術語,這會讓人感到困惑,但是map是Python和其他語言中使用的術語。一位沒有做過任何研究尋找哈希幫助的Python程序員將搜索「Perl地圖的地圖」。最好根據他們知道的術語向他們提供幫助,同時教他們新的術語,或者他們可能永遠找不到他們需要的東西。 –

回答

5

聚合類型(哈希和數組)的值只能是標量,而不能是其他聚合類型。所以如果你要明確使用像你%new_map_date_to_val_,你需要一個參考存儲它來代替:

my %new_map_date_to_val; 
$new_map_date_to_val_ { $date_ } = $val_; 
$strtomap_ { $str_ } = \%new_map_date_to_val_; 

雖然你可以使用匿名哈希來代替:

$strtomap_ { $str_ } = { $date_ => $val _ }; 

而事實上,整個存在測試是不需要的,因爲只需以這種方式解引用一個未定義的值就可以爲您自動生成一個哈希引用。你的整個代碼可以只是:

my %strtomap_; 
$strtomap_ { $str_ } { $date_ } = $val_;