r2 - 25 May 2008 - NelsonFerraz
Como descobrir se um item está contido em um array?
Problema
Você quer descobrir se um determinado elemento está contido dentro de um array.Solução
Use um hash.Discussão
Sempre que você ler a expressão "contido em", esta é uma indicação de que você deveria ter usado um hash ao invés de um array. O hash permite descobrir esta informação imediatamente:
if (defined $item{"foo"}) {
print "Achei!\n";
}
Dessa forma, se você tem um array e vai fazer o teste "contido em" várias vezes, a melhor solução é construir um hash a partir do array:
my @cor = qw(vermelho laranja amarelo verde azul anil violeta);
foreach (@cor) {
$cor{$_} = 1;
}
Uma expressão idiomática comum, para construir um hash a partir dos elementos de uma array é usar um map:
%cor = map { ($_ => 1) } @cor;
Agora você pode testar se diferentes itens fazem parte do hash %cor.
Por favor, não use o seguinte código para tentar descobrir se um determinado item faz parte de uma array:
($achei) = grep { $_ eq $whatever } @array;
Esta operação é extremamente lenta, pois vai verificar item por item -- inclusive depois de ter encontrado o primeiro item, pois a função grep deve ser usada para retornar arrays, e não uma resposta do tipo verdadeiro-ou-falso.
Se você precisa mesmo percorrer a array manualmente, use um last para interromper a pesquisa assim que o primeiro item for encontrado:
foreach (@array) {
next unless $_ eq 'foo';
$achei = 1;
last;
}
Uma solução final consiste em usar um módulo do CPAN.
O List::MoreUtils foi criado para resolver este e outros tipos de problemas comuns com arrays:
use List::MoreUtils qw(:all);
if (any { $_ eq 'foo' } @array) {
print "Achei!\n";
}
A vantagem desta solução é a clareza.
