如何比较Perl中的数组?

dev*_*ech 7 arrays perl

我有两个数组,@a@b.我想在两个数组的元素之间进行比较.

my @a = qw"abc def efg ghy klm ghn";
my @b = qw"def ghy jgk lom com klm";
Run Code Online (Sandbox Code Playgroud)

如果任何元素匹配,则设置一个标志.有没有简单的方法来做到这一点?

DVK*_*DVK 9

首先,需要正确编写2个数组.

@a = ("abc","def","efg","ghy","klm","ghn");
@b = ("def","efg","ghy","klm","ghn","klm");
Run Code Online (Sandbox Code Playgroud)

其次,对于任意数组(例如,其元素可能引用其他数据结构的数组),您可以使用Data::Compare.

对于元素为标量的数组,可以使用BLOCK作为比较子程序进行比较.您可以通过以下方式模拟(如果您没有List :: MoreUtils访问权限):List::MoreUtils pairwise BLOCK ARRAY1 ARRAY2pairwise

if (@a != @b) {
    $equals = 0;
} else {
    $equals = 1;
    foreach (my $i = 0; $i < @a; $i++) {
        # Ideally, check for undef/value comparison here as well 
        if ($a[$i] != $b[$i]) { # use "ne" if elements are strings, not numbers
                                # Or you can use generic sub comparing 2 values
            $equals = 0;
            last;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

PS我不确定,但List :: Compare可能总是对列表进行排序.我不确定它是否可以进行成对比较.

  • 我没有仔细检查它是否有效,但为什么不能"@a = qw"abc def efg ghy klm ghn"`work?难道它不会被解析为用户定义的描述符内的列表(在这种情况下是"`"吗?)它不应该与`qw //`或`qw ||`或`qw( )`或诸如此类的东西. (3认同)
  • @Oesor - 你没有使用Sinan的Time :: Machine模块.我的评论是针对这个问题的原始措辞(在布莱恩编辑之前)说"我的@a ="abc,def,efg,ghy,klm,ghn"` (3认同)

Que*_*tin 7

列表::比较

if ( scalar List::Compare->new(\@a, \@b)->get_intersection ) {
    …
}
Run Code Online (Sandbox Code Playgroud)


Dav*_*lle 5

检查以创建相交函数,该函数将返回两个列表中都存在的项目的列表。那么您的返回值取决于相交列表中的项目数。

您可以在网上轻松找到 Perl 的 intersect 的最佳实现。我记得几年前就曾寻找过。

这是我发现的:

我的@array1 = (1, 2, 3);
我的@array2 = (2, 3, 4);
我的%原始=();
我的@isect = ();

地图 { $original{$_} = 1 } @array1;
@isect = grep { $original{$_} } @array2;