在 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;
我希望对两个字符串列表完成此操作(不区分大小写)。请问有什么有效的方法吗?
In Chapter 4, Section 4.8 (Computing Union, Intersection, or Difference of Unique Lists), the Perl Cookbook provides this technique for getting the intersection of two lists of integers:
@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;
I want this to be done (case-insensitively) for two lists of strings. Any efficient method, please?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
Array::Utils 就是您要寻找的。
这会产生 编辑: 的预期输出,
我没有注意到您希望不区分大小写地完成此操作。在这种情况下,您可以将
@a
替换为map{lc}@a
(同样也可以替换为@b
)。Array::Utils is what you're looking for.
This produces the expected output of
Edit: I didn't notice that you wanted this done case-insensitively. In that case, you can replace
@a
withmap{lc}@a
(and likewise with@b
).原始解决方案所需的更改量最小。只需将字符串小写即可。
Smallest amount of change required from the original solution. Just lower-case the strings.
这是一种
map
/grep
方法:Here's one
map
/grep
approach:您还可以使用 duplicates 函数//github.com/perl5-utils/List-MoreUtils" rel="nofollow noreferrer">List::MoreUtils 模块如下:
这等于 相交 Array::Utils 提到的模块 多于。
You may also use the duplicates function from List::MoreUtils module as follows:
This would be equal to the intersect of the Array::Utils module mentioned above.
给出
1)我在某处找到了这个解决方案,但我不记得在哪里。如果有人知道请告诉我。
2)我不知道与其他解决方案相比,这有多有效。
3)真诚地,我不知道这是如何运作的。为什么有分号而不是逗号?
gives
1) I found this solution somewhere but I don't remember where. If somebody knows please let me know.
2) I have no idea how efficient this is compared to other solutions.
3) Sincerly, I do not know how this works. Why there is a semicolon and not a comma?