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);
}