我有一个问题,其中数字对映射到其他数字对。例如,(1,2)->(12,97)。一些对可能会映射到其他多个对,所以我真正需要的是能够将一对映射到列表列表中,例如(1,2)->((12,97),(4,1))。在一天结束时,我想分别处理每个值(即列表的每个列表)。

在Python中,我可以这样简单地说:

key = ( x, y )
val = [ a, b ]
if (x,y) not in my_dict:
    my_dict[ (x,y) ] = []
my_dict[ (x,y) ].append( [a,b] )

但是,在Perl中,我必须对键和值使用引用。所以我可以肯定地说:
$keyref = [ x1, y1 ]
$valref = [ a, b ]
%my_hash = { $keyref => $valref }

但是,当另一对(x2,y2)出现时会发生什么呢?即使x2 == x1和y2 == y1,$ keyref = [x2,y2]也会与之前生成的keyref不同,因此我看不到进行查找的方法。当然,我可以将(x2,y2)与每个已取消引用的哈希键进行比较,但是毕竟,上帝为我们提供了哈希表,以免这样做。

有Perl解决方案吗?

谢谢,

-W。

最佳答案

在Perl中,所有哈希键都是字符串,或者在查找之前被“字符串化”。使用数组引用作为键通常是错误的方法。

使用“二维”哈希怎么办?

$hash{$x1}{$y1} = [ $a, $b ];
# or
%hash = ( $x1 => { $y1 => [ $a, $b ] } );


($x2,$y2)=($x1,$y1);
print @{$hash{$x2}{$y2}};   # will print $a and $b

关于当键和值都是数组引用时的Perl哈希,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7899077/

10-12 07:34