我需要使用perl比較深層嵌套的數據結構。 結構可以包含標量,數組和散列。 我更喜歡XS實現。 數據最初以JSON形式到達。比較深層嵌套的數據結構忽略數組的順序
在數據模式陣列內的項目順序不能保證,使得它很難進行比較。
我試圖測試::深。當唯一數組處於頂層時,該方法非常簡單,但當順序不敏感數組在結構中嵌套得更深時,該方法非常重要。
我需要使用perl比較深層嵌套的數據結構。 結構可以包含標量,數組和散列。 我更喜歡XS實現。 數據最初以JSON形式到達。比較深層嵌套的數據結構忽略數組的順序
在數據模式陣列內的項目順序不能保證,使得它很難進行比較。
我試圖測試::深。當唯一數組處於頂層時,該方法非常簡單,但當順序不敏感數組在結構中嵌套得更深時,該方法非常重要。
如果陣列中只能包含標量。你可以嘗試使用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.
請注意,如果數據是字符串而非數字,則可能需要更改'sort'以使用'cmp'而不是'<=>'。 – Borodin
你有什麼比較類型?檢查數據結構是否相同?所有數組元素都相等,所有散列鍵匹配? –
是的,比較所有項目/哈希是否具有相同的鍵/值。所有包含相同元素的數組都是不敏感的。 該方法獲得2個引用(很像Test :: Deep)並計算出類型,嵌套和拓撲本身。差異應該有回報或至少記錄。 – user2219195
數組可以包含除標量之外的其他內容嗎?即子陣列或哈希?如果是這樣,你如何確定正確的順序?例如。哪個數組參考應該比較哪個數組ref? –