我有两个数组。我想找到第二个但不是第一个中的元素,以及第一个中的元素,而不是第二个元素。
有没有办法编写多个循环?
每个数组都是这样的$ 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
答案 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实现。您可以在此处查看更多详细信息:
答案 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 ];
}