预先警告,我有点像Perl新手。
我正在寻找一个很好的速记来比较两个数组,比如arrA
和arrB
。
我想知道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";
我对这里的数据结构并不挑剔;如果我可以改变结构以使其更有效,我可以做到。
答案 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";
输出与前一个程序的输出相同。