【问题标题】:Compare two arrays in a easy way using Perl使用 Perl 轻松比较两个数组
【发布时间】:2015-01-16 01:36:10
【问题描述】:

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

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

我需要像下面这样比较“N”个值,

value1 eq value1 
value2 eq value3
value3 eq value4

请建议我是否有任何模块可以做到这一点?

谢谢

【问题讨论】:

    标签: perl cgi


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我不喜欢你的第一个解决方案,因为它比较了两个数组中的每个项目,但你用第二个解决方案解决了这个问题,所以这个答案得到了我迄今为止最好的投票。
      【解决方案3】:

      Perl 已经有一些部分可以解决任何列表操作。

      参见List::Util 和List::MoreUtils。

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

      有关此应用程序,请参阅 List::Util::pairfirst 和 List::MoreUtils::zip

      【讨论】:

      • 虽然这段代码 sn-p 可以解决问题,including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2012-11-25
        • 1970-01-01
        • 1970-01-01
        • 2012-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-25
        相关资源
        最近更新 更多