Aunque buscando en google "perl array search element" obtenemos muchas soluciones a este problema, aquí presentaré 2 muy sencillas.
Para saber únicamente si un elemento está o no está en el array:
# Search an element inside an array and return 1 or 0 if the element is present or not, example: in_array(\@my_array, $element);
sub in_array {
my ($array,$search_for) = @_;
my %items = map {$_ => 1} @$array; # create a hash out of the array values
my $exist = (exists($items{$search_for}))?1:0;
return $exist;
}
Si queremos además poder buscar expresiones regulares en todo el array y
conocer la o las posiciones de los resultados:
# Search a regular expression inside an array and retrieve the positions of the hits, example: in_array(\@my_array, "/$expression/");
sub in_array {
my ($array,$search_for) = @_;
my @pos;
if ($search_for =~ /^\/.+\/$/){
$search_for =~ s/^\/|\/$//g;
@pos = grep { $_ =~ /$search_for/ } @{$array};
} else {
@pos = grep { $_ eq $search_for } @{$array};
}
(scalar @pos)?return (1,\@pos):return (0);
}
Otra opción sería usar el módulo Tie::IxHash que permite crear hashes manteniendo el orden de los elementos y buscar los índices de los mismos:
# Search a regular expression inside an array and retrieve the positions of the hits, example: in_array(\@my_array, "/$expression/");
sub in_array {
my ($array,$search_for) = @_;
my @pos;
if ($search_for =~ /^\/.+\/$/){
$search_for =~ s/^\/|\/$//g;
@pos = grep { $_ =~ /$search_for/ } @{$array};
} else {
@pos = grep { $_ eq $search_for } @{$array};
}
(scalar @pos)?return (1,\@pos):return (0);
}
En Perl moderno, usamos el Smart Matching:
ResponderEliminaruse 5.010;
$x = "hola";
@y = qw( Le dijimos hola a la abuela );
say "Sí está" if $x ~~ @y;
Más información en perlsyn.
Para aquellos que aún sigan usando versiones antiguas de Perl, valdría con un simple grep():
$x = "hola";
@y = qw( Le dijimos hola a la abuela );
print "Sí está\n" if grep { $_ eq $x } @y;
Me quedo con la solución de perl 5 y con la impresión que tengo que actualizar bastante mis conocimientos de Perl :D
ResponderEliminar