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

发布于 2024-12-11 05:55:03 字数 379 浏览 0 评论 0原文

在第 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

相对绾红妆 2024-12-18 05:55:03

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)。

Array::Utils is what you're looking for.

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

This produces the expected output of

c,d

Edit: I didn't notice that you wanted this done case-insensitively. In that case, you can replace @a with map{lc}@a (and likewise with @b).

来世叙缘 2024-12-18 05:55:03

原始解决方案所需的更改量最小。只需将字符串小写即可。

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

Smallest amount of change required from the original solution. Just lower-case the strings.

@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;
绻影浮沉 2024-12-18 05:55:03

这是一种 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)

Here's one map/grep approach:

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)
错爱 2024-12-18 05:55:03

您还可以使用 duplicates 函数//github.com/perl5-utils/List-MoreUtils" rel="nofollow noreferrer">List::MoreUtils 模块如下:

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 提到的模块 多于。

You may also use the duplicates function from List::MoreUtils module as follows:

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

This would be equal to the intersect of the Array::Utils module mentioned above.

活雷疯 2024-12-18 05:55:03
@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)真诚地,我不知道这是如何运作的。为什么有分号而不是逗号?

@a = qw(a B c d);
@b = qw(b c D e f);
@c = grep { $f = lc $_; grep lc $_ eq $f, @b } @a;

gives

B c d

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?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文