Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取Perl中两个字符串列表的交集_Perl - Fatal编程技术网

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

获取Perl中两个字符串列表的交集,perl,Perl,在第4章第4.8节(计算唯一列表的并集、交集或差分)中,提供了获取两个整数列表交集的技术: @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章第4.8节(计算唯一列表的并集、交集或差分)中,提供了获取两个整数列表交集的技术:

@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;
我希望对两个字符串列表执行此操作(不区分大小写)。请问有什么有效的方法吗?

是你要找的

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
替换为
映射{lc}@a
(同样也可以替换为
@b

原始溶液所需的最小变化量。只需将字符串的大小写降低

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

这里有一个
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)
给予

1) 我在某处找到了这个解决方案,但我不记得在哪里。如果有人知道,请告诉我

2) 我不知道这与其他解决方案相比有多高效


3) 老实说,我不知道这是怎么回事。为什么有分号而不是逗号?

只是确认一下,cookbook提供的解决方案不适合我的情况,主要是因为字符串的哈希问题,对吗?呃,实际上,没有,您提供的链接中的解决方案工作得很好,除了区分大小写。“你凭什么认为他们不会呢?”李强——绝对不对。烹饪书使用Perl哈希,这些哈希由字符串索引。事实上,示例中的整数在用作哈希键时会隐式转换为字符串@b=()
@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