Появился новый оператор smart match :
#!/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;
Относительно Массив :: Сравнить :
Внутренне компаратор сравнивает два массива, используя объединение, чтобы превратить оба массива в строки, и сравнивая строки, используя eq
.
Полагаю, это правильный метод, но пока мы используем сравнение строк, я бы предпочел использовать что-то вроде:
#!/usr/bin/perl
use strict;
use warnings;
use List::AllUtils qw( each_arrayref );
my @x = qw(1 2 3);
my @y = (1, 2, 3);
print "[@x] and [@y] match\n" 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, @y)) },
};
Это наихудший сценарий, когда 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% --
iterator
производительность падает довольно быстро, однако:
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% --
Я не смотрел на использование памяти.