在第4章第4.8节(计算联盟,交集或唯一列表的差异)中,Perl Cookbook提供了这种技术来获取两个整数列表的交集:
@a = (1, 3, 5, 6, 7, 8);
@b = (2, 3, 5, 7, 9);
...
foreach $e (@a, @b) {
$union{$e}++ && $isect{$e}++
}
@union = keys %union;
@isect = keys %isect;
我希望这两个字符串列表完成(不区分大小写)。请问有效的方法吗?
答案 0 :(得分:15)
Array::Utils正是您要找的。 p>
use Array::Utils qw(:all);
my @a = qw( a b c d );
my @b = qw( c d e f );
my @isect = intersect(@a, @b);
print join(",",@isect) . "\n";
这会产生
的预期输出c,d
编辑:我没有注意到您希望这种情况不区分大小写。在这种情况下,您可以将@a
替换为map{lc}@a
(同样替换为@b
)。
答案 1 :(得分:3)
以下是一种map
/ grep
方法:
my @a = qw(Perl PHP Ruby Python C JavaScript);
my @b = qw(erlang java perl python c snobol lisp);
my @intersection =
grep { defined }
@{ { map { lc ,=> $_ } @a } }
{ map { lc } @b };
# @intersection = qw(Perl Python C)
答案 2 :(得分:1)
原始解决方案所需的最小更改量。只是小写字符串。
@a = qw( a b c d );
@b = qw( C D E F );
...
foreach $e (@a, @b) {
$union{lc $e}++ && $isect{lc $e}++
}
@union = keys %union;
@isect = keys %isect;
答案 3 :(得分:0)
@a = qw(a B c d);
@b = qw(b c D e f);
@c = grep { $f = lc $_; grep lc $_ eq $f, @b } @a;
给予
B c d
1)我在某个地方找到了此解决方案,但我不记得在哪里。如果有人知道,请告诉我。
2)我不知道与其他解决方案相比效率如何。
3)诚挚的,我不知道这是如何工作的。为什么会有分号而不是逗号?