替代 array_minus 在 Perl 中扩展引用
Alternative to array_minus that expands references in Perl
我在 Perl 中有散列引用数组。我需要比较它们,即有效地做 array_minus()
所做的事情,但我需要通过散列的 content 而不是参考来进行比较。
拿这个 MWE:
#!/usr/bin/perl
use Array::Utils qw(:all);
use Data::Dumper;
my %en = ( 'first' => 'one', 'second' => 'two', 'third' => 'three' );
my %en2 = ( 'first' => 'one', 'second' => 'two', 'third' => 'three' );
my %eo = ( 'first' => 'unu', 'second' => 'du', 'third' => 'tri' );
my @set = ( \%en, \%eo );
my @subset = ( \%en2 );
print(Dumper(array_minus(@set,@subset)));
我相信array_minus()
比较不同的引用,所以输出是:
$VAR1 = {
'first' => 'one',
'second' => 'two',
'third' => 'three'
};
$VAR2 = {
'first' => 'unu',
'second' => 'du',
'third' => 'tri'
};
是否有替代方案或选项可以根据哈希值的内容进行比较?当然,当 MWE 中的哈希值未通过引用包含时,比较工作正常并且仅返回一个哈希值。
像这样的东西应该可以工作(未经测试):
sub serialize {
use JSON::XS;
JSON::XS->new->pretty(0)->ascii(1)->canonical(1)->encode($_[0])
}
sub array_minus_deep(\@\@) {
my ($array,$minus) = @_;
my %minus = map( ( serialize($_) => 1 ), @$minus );
grep !$minus{ serialize($_) }, @$array
}
我在 Perl 中有散列引用数组。我需要比较它们,即有效地做 array_minus()
所做的事情,但我需要通过散列的 content 而不是参考来进行比较。
拿这个 MWE:
#!/usr/bin/perl
use Array::Utils qw(:all);
use Data::Dumper;
my %en = ( 'first' => 'one', 'second' => 'two', 'third' => 'three' );
my %en2 = ( 'first' => 'one', 'second' => 'two', 'third' => 'three' );
my %eo = ( 'first' => 'unu', 'second' => 'du', 'third' => 'tri' );
my @set = ( \%en, \%eo );
my @subset = ( \%en2 );
print(Dumper(array_minus(@set,@subset)));
我相信array_minus()
比较不同的引用,所以输出是:
$VAR1 = {
'first' => 'one',
'second' => 'two',
'third' => 'three'
};
$VAR2 = {
'first' => 'unu',
'second' => 'du',
'third' => 'tri'
};
是否有替代方案或选项可以根据哈希值的内容进行比较?当然,当 MWE 中的哈希值未通过引用包含时,比较工作正常并且仅返回一个哈希值。
像这样的东西应该可以工作(未经测试):
sub serialize {
use JSON::XS;
JSON::XS->new->pretty(0)->ascii(1)->canonical(1)->encode($_[0])
}
sub array_minus_deep(\@\@) {
my ($array,$minus) = @_;
my %minus = map( ( serialize($_) => 1 ), @$minus );
grep !$minus{ serialize($_) }, @$array
}