Arrays 忽略数组顺序比较深度嵌套的数据结构

Arrays 忽略数组顺序比较深度嵌套的数据结构,arrays,perl,compare,Arrays,Perl,Compare,我需要使用perl比较深层嵌套的数据结构。 结构可以包含标量、数组和散列。 我更喜欢XS实现。 数据最初以JSON的形式到达 在数据模式中,数组中的项顺序无法保证,因此很难进行比较 我试着用Test::Deep。当唯一的数组位于顶层时,这种方法很简单,但当不区分顺序的数组嵌套在结构中的较深位置时,这种方法很重。如果数组只能包含标量。你可以试着用它。下面是一个使用数值数组的示例。您需要为Data::compare编写插件,有关更多信息,请参阅 test.pl: use lib '.'; use s

我需要使用perl比较深层嵌套的数据结构。 结构可以包含标量、数组和散列。 我更喜欢XS实现。 数据最初以JSON的形式到达

在数据模式中,数组中的项顺序无法保证,因此很难进行比较


我试着用Test::Deep。当唯一的数组位于顶层时,这种方法很简单,但当不区分顺序的数组嵌套在结构中的较深位置时,这种方法很重。

如果数组只能包含标量。你可以试着用它。下面是一个使用数值数组的示例。您需要为
Data::compare
编写插件,有关更多信息,请参阅

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";
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();
/Data/Compare/Plugins/ArrayBag.pm

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

如果数组只能包含标量。你可以试着用它。下面是一个使用数值数组的示例。您需要为
Data::compare
编写插件,有关更多信息,请参阅

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";
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();
/Data/Compare/Plugins/ArrayBag.pm

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

你想做什么样的比较?检查数据结构是否相同?所有数组元素都相等,并且所有哈希键都匹配?是,比较所有项/哈希是否具有相同的键/值。包含相同元素的所有数组不区分顺序。该方法获得2个引用(很像Test::Deep),并计算出类型、嵌套和拓扑本身。差异应该在返回时可用,或者至少记录。数组是否可以包含标量以外的内容?即子数组或散列?如果是,您如何确定正确的顺序?例如,应将哪个数组引用与哪个数组引用进行比较?您想进行哪种类型的比较?检查数据结构是否相同?所有数组元素都相等,并且所有哈希键都匹配?是,比较所有项/哈希是否具有相同的键/值。包含相同元素的所有数组不区分顺序。该方法获得2个引用(很像Test::Deep),并计算出类型、嵌套和拓扑本身。差异应该在返回时可用,或者至少记录。数组是否可以包含标量以外的内容?即子数组或散列?如果是,您如何确定正确的顺序?例如,应将哪个数组引用与哪个数组引用进行比较?请注意,如果数据是字符串而非数字,则可能需要将
排序
更改为使用
cmp
,而不是
。请注意,如果数据是字符串而非数字,则可能需要将
排序
更改为使用
cmp