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

tom*_*afe 0 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";
Run Code Online (Sandbox Code Playgroud)

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

Bor*_*din 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";
Run Code Online (Sandbox Code Playgroud)

产量

Elements of arrB that are not in arrA: ddd
Run Code Online (Sandbox Code Playgroud)

或者,如果您有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";
Run Code Online (Sandbox Code Playgroud)

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