使用Perl轻松比较两个数组

9
在Perl中有没有简单的方法来比较两个字符串数组?
@array1  = (value1, value2, value3...);
@array2  = (value1, value3, value4...);

我需要对“N”个值进行以下比较:
value1 eq value1 
value2 eq value3
value3 eq value4

请问是否有适用于此的模块?

谢谢。

4个回答

8

嗯...你说要一个比较数组的模块。那么Array::Compare怎么样?

use Array::Compare;

my $compare = Array::Compare->new;

my @array1  = (value1, value2, value3...);
my @array2  = (value1, value3, value4...);

if ($compare->compare(\@array1, \@array2)) {
  say "Arrays are the same";
} else {
  say "Arrays are different";
}

但是你也可以使用智能匹配运算符。
if (@array1 ~~ @array2) {
  say "Arrays are the same";
} else {
  say "Arrays are different";
}

好的回答。只是有一个小的改正。在包含if语句的行上需要一个关闭括号(例如,if ($compare->compare(\@array1, \@array2)) {)。 - JeremyCanfield

4

您可以比较两个数组的大小(在标量上下文中为@a1 == @a2),然后将@a1数组的大小与索引列表的大小进行比较,这些索引代表两个数组中相等的字符串(grep $a1[$_] eq $a2[$_], 0..$#a1)。

if (@a1 == @a2 and @a1 == grep $a1[$_] eq $a2[$_], 0..$#a1) { print "equal arrays\n" }

更注重性能的版本(如果不必要,不会遍历所有元素),
use List::Util 'all';

if (@a1 == @a2 and all{ $a1[$_] eq $a2[$_] } 0..$#a1) { print "equal arrays\n" }

1
我不喜欢你的第一个解决方案,因为它比较了两个数组中的每个项,但是你通过第二个解决方案解决了这个问题,所以这个答案是迄今为止最好的,我投了赞成票。 - Sam Choukri

3

1
虽然这段代码片段可能解决了问题,但包括解释真的有助于提高您的帖子质量。请记住,您正在为未来的读者回答问题,而这些人可能不知道您的代码建议原因。 - msrd0

2

这项任务相对简单,我不一定希望使用CPAN模块。相反,我可能会编写自己的比较子例程并将其放入自己的实用程序模块中。这是一个实现,可以比较包含字符串和/或整数的两个数组。

#!/usr/bin/env perl

use strict;
use warnings;

my @array1  = (1..10, 'string');
my @array2  = (1..10, 'string');

my $is_same = is_same(\@array1, \@array2);

print "is_same: $is_same\n";

sub is_same {
  my($array1, $array2) = @_;

  # immediately return false if the two arrays are not the same length
  return 0 if scalar(@$array1) != scalar(@$array2);

  # turn off warning about comparing uninitialized (undef) string values
  # (limited in scope to just this sub)
  no warnings;

  for (my $i = 0; $i <= $#$array1; $i++) {
    if ($array1->[$i] ne $array2->[$i]) {
      return 0;
    }
  }

  return 1;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接