使用Perl以简单的方式比较两个数组

时间:2014-11-18 18:36:33

标签: perl cgi

有没有简单的方法来比较Perl中的两个字符串数组?

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

我需要比较如下“N”数值,

value1 eq value1 
value2 eq value3
value3 eq value4

请建议我有什么模块可以做到这一点吗?

由于

4 个答案:

答案 0 :(得分:7)

嗯...比较数组的模块,你说。 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";
}

答案 1 :(得分:4)

您可以比较两个数组的大小(标量上下文中的@a1 == @a2),然后将@a1数组的大小与两个数组中相等字符串对应的索引列表的大小进行比较({{1 }}),

grep $a1[$_] eq $a2[$_], 0..$#a1

更多以性能为导向的版本(如果没有必要,不会遍历所有元素),

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

答案 2 :(得分:3)

Perl已经为解决任何列表操作提供了一些部分。

请参阅List::UtilList::MoreUtils

my $arrays_are_equal
    = !List::Util::pairfirst { $a ne $b }      # first case where $a != $b
      List::MoreUtils::zip( @array1, @array2 ) 
    ;

对于此应用程序,请参阅List::Util::pairfirstList::MoreUtils::zip

答案 3 :(得分:1)

这项任务很简单,我不一定要使用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;
}