2011-08-28 60 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_;