获取Perl中两个字符串列表的不区分大小写的交集

wvmv3b1j  于 2022-11-15  发布在  Perl
关注(0)|答案(5)|浏览(166)

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

我希望对两个字符串列表都这样做(不区分大小写)。有什么有效的方法吗?

ztmd8pv5

ztmd8pv51#

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替换为@a)。

xqk2d5yq

xqk2d5yq2#

对原始解决方案所做的最小更改。仅将字符串小写。

@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;
w3nuxt5m

w3nuxt5m3#

以下是一种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)
6yoyoihd

6yoyoihd4#

您也可以使用List::MoreUtils模块中的duplicates函数,如下所示:

use List::MoreUtils qw( duplicates );

my @php56 = qw( json big_int imap );
my @php44 = qw( json imap bcmath );

say $_
  for duplicates @php56, @php44;

# Output: json, imap

这将等于上面提到的Array::Utils模块的交集。

ecfdbz9o

ecfdbz9o5#

@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)真诚地说,我不知道这是怎么回事。为什么有分号而没有逗号?

相关问题