查找数组B中不在数组A中的任何元素

时间:2014-04-09 00:56:02

标签: arrays perl

预先警告,我有点像Perl新手。

我正在寻找一个很好的速记来比较两个数组,比如arrAarrB

我想知道arrB中是否有任何元素不在arrA内。

如果重要,这些数组中的元素就是字符串。

我知道我可以通过遍历数组并使用grep来实现这一点,但我想知道是否有一个很好的速记方式来做到这一点。我的Perl-fu缺乏。

谢谢!

编辑:以下是我正在寻找的内容,如果我上面不清楚的话。

my @arrA = ( "aaa", "bbb", "ccc" );
my @arrB = ( "aaa", "bbb", "ccc", "ddd" );
my @BnotA = ();

# Something goes here, help!

print "Elements of arrB that are not in arrA: @BnotA\n";

我对这里的数据结构并不挑剔;如果我可以改变结构以使其更有效,我可以做到。

1 个答案:

答案 0 :(得分:5)

执行此操作的最有效方法是根据@arrA的内容构建哈希。然后,可以快速检查@arrB的元素,看它们是否存在于@arrA

喜欢这个

use strict;
use warnings;

my @arrA = ( "aaa", "bbb", "ccc" );
my @arrB = ( "aaa", "bbb", "ccc", "ddd" );

my %arrA_hash = map { $_ => 1 } @arrA;
my @BnotA = grep { not $arrA_hash{$_} } @arrB;

print "Elements of arrB that are not in arrA: @BnotA\n";

<强>输出

Elements of arrB that are not in arrA: ddd

或者,如果您拥有Array::Utils模块或愿意安装它,则可以使用该模块的array_minus功能。这看起来像这样

use strict;
use warnings;

use Array::Utils 'array_minus';

my @arrA = ( "aaa", "bbb", "ccc" );
my @arrB = ( "aaa", "bbb", "ccc", "ddd" );

my @BnotA = array_minus(@arrB, @arrA);

print "Elements of arrB that are not in arrA: @BnotA\n";

输出与前一个程序的输出相同。