使用Perl轻松比较两个数组

5lhxktic  于 2022-11-15  发布在  Perl
关注(0)|答案(4)|浏览(231)

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

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

我需要像下面的比较为“N”值的数量,

value1 eq value1 
value2 eq value3
value3 eq value4

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

muk1a3rh

muk1a3rh1#

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

yqkkidmi2#

您可以比较两个数组的大小(标量上下文中为@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" }
edqdpe6u

edqdpe6u3#

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**

vc9ivgsu

vc9ivgsu4#

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

相关问题