Il y a le nouveau opérateur de jumelage intelligent :
#!/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;
Concernant Array::Compare :
En interne, le comparateur compare les deux tableaux en utilisant join pour transformer les deux tableaux en chaînes et en comparant les chaînes à l'aide de eq
.
Je suppose que c'est une méthode valable, mais tant que nous utilisons des comparaisons de chaînes de caractères, je préférerais utiliser quelque chose comme :
#!/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;
}
Si les tableaux que vous comparez sont de grande taille, les joindre va demander beaucoup de travail et consommer beaucoup de mémoire par rapport à la simple comparaison de chaque élément un par un.
Mise à jour : Bien sûr, il faut tester de telles affirmations. Des points de repère simples :
#!/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)) },
};
C'est le pire scénario dans lequel elementwise_eq
doit parcourir chaque élément des deux tableaux 1_000 fois et ça se voit :
Rate iterator array\_comp
iterator 246/s -- -75%
array\_comp 1002/s 308% --
D'un autre côté, le meilleur scénario est :
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
Cependant, les performances diminuent assez rapidement :
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% --
Je n'ai pas regardé l'utilisation de la mémoire.