替代 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
}