我需要使用perl比较深层嵌套的数据结构。 结构可以包含标量,数组和散列。 我更喜欢XS实现。 数据最初以JSON的形式到达。
在数据模式中,数组内的项目顺序无法保证,因此难以比较。
我试过Test :: Deep。当唯一的数组位于顶层时,方法很容易,但当顺序不敏感的数组嵌套在结构的更深处时,方法很重。
答案 0 :(得分: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";
<强> ./数据/比较/插件/ 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.