2011-10-26 9 views
5

数字のペアが他のペアのペアにマップされるという問題があります。たとえば、(1,2)→(12,97)です。いくつかのペアは複数の他のペアにマップされることがありますので、本当に必要なのは、ペアを(1,2) - >((12,97)、(4,1))のようなリストのリストにマップする機能です。一日の終わりに、各値(すなわち、各リストのリスト)を別々に処理したいと考えています。キーと値の両方が配列参照である場合のPerlハッシュ

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で、私はキーと値のためにREFを使用する必要があります。だから私は確かに言うことができます:

$keyref = [ x1, y1 ] 
$valref = [ a, b ] 
%my_hash = { $keyref => $valref } 

しかし、別のペア(x​​2、y2)が来るとどうなりますか? x2 == x1とy2 == y1であっても、$ keyref = [x2、y2]は生成された前回のkeyrefとは異なるので、ルックアップを行う方法は見当たりません。もちろん、(x2、y2)と逆参照された各ハッシュキーとを比較することができましたが、結局のところ、神は私たちにハッシュテーブルを与えて、そうする必要を避けました。

Perlソリューションはありますか?

-W。

-W

+0

参照をキーとして使用することはできません。 (少なくとも*結合*ハッシュを使用しないで) –

答えて

0

私はソケット人形のソリューションを使用して終了(inを使用マイケル・カルメンの選択肢3の形)。 FYI、ここに私のアプリで必要なすべての操作を実行する小さなPerlスクリプトです。

2行目、3行目、4行目、5行目:同じ構文を使用し、0行目と1行目はちょうど途中のサニティチェックとして意図されていました。

これが提案された解決策に追加するものは、配列の配列をキーと共に使用する値として使用することです。

@k1 = (12, 13); 
$aref = [ 11, 22 ]; 
$bref = [ 33, 44 ]; 
%h = {}; 
if(not exists $h{$k1[0]}{$k1[1]}) { 
    print "initializing\n"; 
    $h{$k1[0]}{$k1[1]} = []; 
} 
push @{$h{$k1[0]}{$k1[1]}}, $aref; 
push @{$h{$k1[0]}{$k1[1]}}, $bref; 
print "0: ", join ':', @{$h{$k1[0]}{$k1[1]}}, "\n"; 
print "1: ", join ':', ${$h{$k1[0]}{$k1[1]}}[0], "\n"; 
print "2: ", join ':', @{${$h{$k1[0]}{$k1[1]}}[0]}, "\n"; 
print "3: ", join ':', @{${$h{$k1[0]}{$k1[1]}}[1]}, "\n"; 
print "4: ", join ':', @{$h{$k1[0]}{$k1[1]}->[0]}, "\n"; 
print "5: ", join ':', @{$h{$k1[0]}{$k1[1]}->[1]}, "\n"; 

P.S.私はこれをコメントとして追加しましたが、長すぎるので、実際の例を含めると意味があると思いました。

+0

溶液におめでとう。あなたができるときは、他の人があなたの成功から学ぶかもしれないようにあなたの答えを「受け入れられた」とマークしてください。乾杯〜 –

10

Perlでは、すべてのハッシュキーが文字列であるか、ルックアップ前に「文字列化されています」。配列参照をキーとして使用するのは、通常、間違った方法です。

"2次元"ハッシュを使用することはどうですか?

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


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

Brilliant!ありがとうございました。 – wchlm

2

ほとんどのものがPerlのように、TMTOWTDIです。

オプション1:使用多次元配列のエミュレーション

$hash{$x,$y} = [$a, $b]; 

も組み込み変数$;のマニュアルを参照してください。

オプション2:使用Hash::MultiKeyモジュール

tie %hash, 'Hash::MultiKey'; 
$hash{[$x, $y]} = [$a, $b]; 

オプション3:HOH(ハッシュのハッシュ)の代わりに

$hash{$x}{$y} = [$a, $b]; 
+0

私はSocket Puppetのソリューション(あなたのオプション3の形で)を使ってしまった。参考までに、ここでは私のアプリで行う必要のあるすべての操作を実行する小さなPerlスクリプトがあります。 2行目、3行目、4行目、5行目:同じ構文を使用して異なる構文を使用します。0:と1:は途中で正当性チェックとして意図されています。これがこれらの例に追加する唯一のことは、配列の配列をキーに沿った値として使用することです。 – wchlm

関連する問題