2017-02-28 6 views
0

深く入れ子になったデータ構造をperlで比較する必要があります。 構造体にスカラー、配列、ハッシュを含めることができます。 私はXSの実装を好むでしょう。 データは元々JSONとして届きました。配列の順序を無視して深くネストされたデータ構造を比較する

データスキーマでは、配列内のアイテムの順序は保証されず、比較が難しくなります。

私はTest :: Deepを試しました。アプローチは、唯一の配列がトップレベルにあるときは簡単ですが、オーダーセンシティブな配列が構造内に深く入れ子になっていると重いです。

+0

どのような比較をお考えですか?データ構造が同一かどうかをチェックするには?すべての配列要素が等しく、すべてのハッシュキーが一致しますか? –

+0

はい、すべてのアイテム/ハッシュが同じキー/値を持つかどうかを比較します。同じ要素を含むすべての配列は、順序に依存しません。 メソッドは2つの参照(Test :: Deepとよく似ています)を取得し、型、ネスティング、およびトポロジ自体を取り出します。差異はリターンまたは少なくともログに記録されている必要があります。 – user2219195

+0

配列にスカラー以外のものを含めることはできますか?私。サブ配列またはハッシュ?もしそうなら、どうすれば正しい注文を決めることができますか?例えば。どの配列refをどの配列refと比較すべきか? –

答えて

2

アレイにはスカラーしか含めることができない場合。あなたはData::Compareを試してみることができます。数値配列を使用した例を示します。詳細については、Data::compareのプラグインを書き込む必要があります(Data::Compare::Pluginsを参照)。

test.pl

use lib '.'; 
use strict; 
use warnings; 
use Data::Compare; 

my $h1 = { a => {b => [2, 1, 3] }, c => 3}; 
my $h2 = { a => {b => [1, 2, 3] }, c => 3}; 

print 'The structures $h1 and $h2 are ', 
    Compare($h1, $h2) ? "" : "not ", "identical.\n"; 

./Data/Compare/Plugins/ArrayBag.pmtest.plを実行しているから

package Data::Compare::Plugins::ArrayBag; 

use strict; 
use warnings; 
use Data::Compare; 

sub _register { 
    return [ 
     ['ARRAY', 'ARRAY', \&array_compare], 
    ]; 
} 

sub array_compare { 
    my($a1, $a2) = @_; 

    return 0 if (scalar @$a1) != (scalar @$a2); 
    my @ar1 = sort { $a <=> $b } @$a1; 
    my @ar2 = sort { $a <=> $b } @$a2; 
    for my $i (0..$#ar1) { 
     return 0 if $ar1[$i] != $ar2[$i]; 
    } 
    return 1; 
} 

_register(); 

出力

The structures $h1 and $h2 are identical. 
+1

データが文字列で数値でない場合、 'sort'は' <=> 'の代わりに 'cmp'を使うように変更する必要があることに注意してください。 – Borodin

関連する問題