首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扩展Perl中引用的array_minus的替代方案

扩展Perl中引用的array_minus的替代方案
EN

Stack Overflow用户
提问于 2016-02-23 11:07:31
回答 1查看 226关注 0票数 0

我有Perl中的哈希引用数组。我需要比较它们,也就是说,有效地执行array_minus()所做的事情,但我需要根据哈希的内容而不是引用来进行比较。

拿这辆MWE:

代码语言:javascript
复制
#!/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()比较了不同的引用,因此输出如下:

代码语言:javascript
复制
$VAR1 = {
          'first' => 'one',
          'second' => 'two',
          'third' => 'three'
        };
$VAR2 = {
          'first' => 'unu',
          'second' => 'du',
          'third' => 'tri'
        };

是否有一种替代方案,或一种选项,可以根据散列的内容进行比较?当然,当MWE中的散列不被引用包含时,比较工作正确,并且只返回一个散列。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-23 12:10:12

像这样的东西应该能起作用(未经测试):

代码语言:javascript
复制
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
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35575873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档