在Perl中,有一个内置的方法来比较两个数组的平等?
我有两个字符串数组,我想比较相等:
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:
我想这是一个有效的方法,但只要我们使用字符串比较,我宁愿使用像: #!/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% -- 我没有看内存利用率。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |