2017-02-28 80 views
0

我需要使用perl比較深層嵌套的數據結構。 結構可以包含標量,數組和散列。 我更喜歡XS實現。 數據最初以JSON形式到達。比較深層嵌套的數據結構忽略數組的順序

在數據模式陣列內的項目順序不能保證,使得它很難進行比較。

我試圖測試::深。當唯一數組處於頂層時,該方法非常簡單,但當順序不敏感數組在結構中嵌套得更深時,該方法非常重要。

+0

你有什麼比較類型?檢查數據結構是否相同?所有數組元素都相等,所有散列鍵匹配? –

+0

是的,比較所有項目/哈希是否具有相同的鍵/值。所有包含相同元素的數組都是不敏感的。 該方法獲得2個引用(很像Test :: Deep)並計算出類型,嵌套和拓撲本身。差異應該有回報或至少記錄。 – user2219195

+0

數組可以包含除標量之外的其他內容嗎?即子陣列或哈希?如果是這樣,你如何確定正確的順序?例如。哪個數組參考應該比較哪個數組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.pm

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(); 

輸出從運行test.pl

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

請注意,如果數據是字符串而非數字,則可能需要更改'sort'以使用'cmp'而不是'<=>'。 – Borodin