获取Perl中两个字符串列表的交集

时间:2011-10-20 20:54:21

标签: perl

在第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;

我希望这两个字符串列表完成(不区分大小写)。请问有效的方法吗?

4 个答案:

答案 0 :(得分:15)

Array::Utils正是您要找的。

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)诚挚的,我不知道这是如何工作的。为什么会有分号而不是逗号?