加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在Perl中,有一个内置的方法来比较两个数组的平等?

发布时间:2020-12-15 21:26:33 所属栏目:大数据 来源:网络整理
导读:我有两个字符串数组,我想比较相等: my @array1 = ("part1","part2","part3","part4");my @array2 = ("part1","PART2","part4"); 是否有一个内置的方法来比较数组,就像有标量? 我试过了: if (@array1 == @array2) {...} 但它只是在标量上下文中评估每个
我有两个字符串数组,我想比较相等:
my @array1 = ("part1","part2","part3","part4");
my @array2 = ("part1","PART2","part4");

是否有一个内置的方法来比较数组,就像有标量?
我试过了:

if (@array1 == @array2) {...}

但它只是在标量上下文中评估每个数组,因此比较每个数组的长度。

我可以滚动我自己的函数来做它,但它似乎像这样一个低级操作,应该有一个内置的方法来做到这一点。在那儿?

编辑:可悲的是,我没有访问5.10或可选组件。

解决方法

有新的 smart match operator:
#!/usr/bin/perl

use 5.010;
use strict;
use warnings;

my @x = (1,2,3);
my @y = qw(1 2 3);

say "[@x] and [@y] match" if @x ~~ @y;

关于Array::Compare:

Internally the comparator compares the two arrays by using join to turn both arrays into strings and comparing the strings using eq.

我想这是一个有效的方法,但只要我们使用字符串比较,我宁愿使用像:

#!/usr/bin/perl

use strict;
use warnings;

use List::AllUtils qw( each_arrayref );

my @x = qw(1 2 3);
my @y = (1,3);

print "[@x] and [@y] matchn" if elementwise_eq( (@x,@y) );

sub elementwise_eq {
    my ($xref,$yref) = @_;
    return unless  @$xref == @$yref;

    my $it = each_arrayref($xref,$yref);
    while ( my ($x,$y) = $it->() ) {
        return unless $x eq $y;
    }
    return 1;
}

如果你正在比较的数组很大,加入它们将做大量的工作,并消耗大量的内存,而不仅仅是逐个比较每个元素。

更新:当然,应该测试这样的语句。简单基准:

#!/usr/bin/perl

use strict;
use warnings;

use Array::Compare;
use Benchmark qw( cmpthese );
use List::AllUtils qw( each_arrayref );

my @x = 1 .. 1_000;
my @y = map { "$_" } 1 .. 1_000;

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

cmpthese -5,{
    iterator => sub { my $r = elementwise_eq((@x,@y)) },array_comp => sub { my $r = $comp->compare((@x,};

这是最糟糕的情况,其中elementwise_eq必须遍历两个数组中的每个元素1_000次,它显示:

             Rate   iterator array_comp
iterator    246/s         --       -75%
array_comp 1002/s       308%         --

另一方面,最好的情况是:

my @x = map { rand } 1 .. 1_000;
my @y = map { rand } 1 .. 1_000;
              Rate array_comp   iterator
array_comp   919/s         --       -98%
iterator   52600/s      5622%         --

迭代器性能下降很快,但是:

my @x = 1 .. 20,map { rand } 1 .. 1_000;
my @y = 1 .. 20,map { rand } 1 .. 1_000;
              Rate   iterator array_comp
iterator   10014/s         --       -23%
array_comp 13071/s        31%         --

我没有看内存利用率。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读