如何在Perl中比较两个数组

时间:2014-01-15 10:20:27

标签: arrays perl

我有两个数组。我想找到第二个但不是第一个中的元素,以及第一个中的元素,而不是第二个元素。

有没有办法编写多个循环?

每个数组都是这样的$ array_2d_1

0  ARRAY(0x9929210)
   0  ARRAY(0x98df3d8)
      0  71
      1  22
      2  15
      3  10
      4  51
   1  ARRAY(0x9934900)
      0  91
      1  82
      2  28
      3  11
      4  91

4 个答案:

答案 0 :(得分:1)

你无法避免循环。这个解决方案有四个循环,但它们没有嵌套。

my %a1 = map { $_ => 1 } @a1;
my %a2 = map { $_ => 1 } @a2;

my @missing_from_a1 = grep !$a1{$_}, @a2;
my @missing_from_a2 = grep !$a2{$_}, @a1;

答案 1 :(得分:1)

您可以使用模块List::Compare执行此任务:

use strict;
use warnings;
use List::Compare;

my @arr1 = qw/5 8 12 42 99 10/;
my @arr2 = qw/10 20 12 18 99 10/;

my $lc = List::Compare->new( \@arr1, \@arr2 );

my @arr1Only = $lc->get_Lonly;
print "\@arr1 only: @arr1Only\n";

my @arr2Only = $lc->get_Ronly;
print "\@arr2 only: @arr2Only\n";

输出:

@arr1 only: 42 5 8
@arr2 only: 18 20

希望这有帮助!

答案 2 :(得分:0)

我认为你正在寻找像perl中的set实现一样的东西。在标准的perl中没有set实现,这里是cpan中的模块,可以实现你想要解决的问题set。因此,我们必须找到一种方法,我们可以从数组中创建唯一元素,并且perl中的哈希键是唯一的。通过使用哈希实现,我们可以实现set实现。您可以在此处查看更多详细信息:

Set Implementation

答案 3 :(得分:0)

要获取两组之间的设置差异,必须在某处涉及循环。我假设你想避免在每次需要计算集合差异而不是unhealthy aversion to loops时写出循环。

一种简单的方法是将操作抽象为子程序:

#!/usr/bin/env perl

use strict;
use warnings;

main();

sub main {
    my @x = (1, 2, 3, 4, 5);
    my @y = (3, 5, 7, 8, 9);

    for my $sets ( ([\(@x, @y)], [\(@y, @x)]) ) {
        print "@{ set_diff( @$sets ) }\n";
    }
}

sub set_diff {
    my $x = shift;
    my %y = map { $_ => undef } @{ $_[0] };
    return [ grep not( exists $y{$_} ), @$x ];
}

还有一些set implementations on CPAN