0

配列のハッシュが 2 つあります。配列の両方のハッシュのキーに同じ値が含まれているかどうかを比較したい。

#!/usr/bin/perl
use warnings; use strict;
my %h1 = (
      w => ['3','1','2'],
      e => ['6','2','4'],
      r => ['8', '1'],
     );

my %h2 = (
      w => ['1','2','3'],
      e => ['4','2','6'],
      r => ['4','1'],
     );

foreach ( sort {$a <=> $b} (keys %h2) ){
    if (join(",", sort @{$h1{$_}})
        eq join(",", sort @{$h1{$_}})) {    

        print join(",", sort @{$h1{$_}})."\n";
        print join(",", sort @{$h2{$_}})."\n\n";
    } else{
    print "no match\n"
    }
    }


if ("1,8" eq "1,4"){
    print "true\n";
} else{
    print "false\n";
}

出力は次のようになります。

2,4,6
2,4,6

1,2,3
1,2,3

no match
false

しかし、何らかの理由で私のものが機能しif-statementていません。ありがとう

4

3 に答える 3

2

スマート マッチは興味深いソリューションです。5.010 以降で利用可能:

if ([sort @{$h1{$_}}] ~~ [sort @{$h2{$_}}]) { ... }

配列参照のスマート マッチは、各配列の対応する要素がそれ自体にスマート マッチする場合に true を返します。文字列の場合、スマート マッチングは文字列が等しいかどうかをテストします。

これはjoin、任意のデータに対してスマート マッチングが機能するため、配列のメンバーを ing するよりも優れている場合があります*。一方、スマート マッチングは非常に複雑で、落とし穴が隠れています。


*任意のデータ: すべての文字列に数値のみが含まれていることが保証されている場合、すべて問題ありません。ただし、代わりに数値を使用することもできます。

%h1 = (w => [3, 1, 2], ...);
# sort defaults to alphabetic sorting. This is undesirable here
if ([sort {$a <=> $b} @{$h1{$_}}] ~~ [sort {$a <=> $b} @{$h2{$_}}]) { ... }

データに任意の文字列、特にコンマを含む文字列が含まれている可能性がある場合、比較は安全ではありません — 配列を検討してください

["1foo,2bar", "3baz"], ["1foo", "2bar,3baz"] # would compare equal per your method
于 2013-03-28T23:24:43.770 に答える
1
if (join(",", sort @{$h1{$_}})
    eq join(",", sort @{$h1{$_}})) {  

する必要があります:

if (join(",", sort @{$h1{$_}})
    eq join(",", sort @{$h2{$_}})) {  

に注意してください$h2。1 つのハッシュをそれ自体と比較しています。

于 2013-03-28T23:18:35.090 に答える
0

これを試してください:2つのハッシュを1行ずつ正確に比較します。

if (  join(",", sort @{ $h1{$_}})
      eq join(",", sort @{ $h2{$_}}) ) #Compares two lines exactly   
于 2013-03-28T23:19:06.577 に答える