2010-07-11 19 views
17

¿Tiene Perl una función incorporada para obtener el índice de un elemento en una matriz? ¿O necesito escribir esa función por mi cuenta? [Equivalente a PHP array_search() o JavaScript Array.indexOf()]¿Cómo obtener el índice de un elemento en una matriz?

+7

Qué hay en la matriz? La búsqueda de una matriz es una bandera roja que me lleva a evaluar si podría estar utilizando una mejor estructura de datos. Recuerde: * ¡hashes * son para buscar! –

+1

Duplicado: http://stackoverflow.com/questions/1915746/in-perl-how-can-i-find-the-index-of-a-given-value-in-an-array – FMc

Respuesta

39
use List::Util qw(first); 
$idx = first { $array[$_] eq 'whatever' } 0..$#array; 

(Lista :: Util es el núcleo)

o

use List::MoreUtils qw(firstidx); 
$idx = firstidx { $_ eq 'whatever' } @array; 

(Lista :: MoreUtils está en CPAN)

+2

Este es definitivamente el camino para ir, 9 veces de cada 10. – Zaid

+0

¿Por qué es esto mejor que su solución, Zaid? – masonk

+1

@masonk: compatibilidad con versiones anteriores para uno. Además, 'first' saldrá del bucle implícito al encontrar el índice que coincida. El equivalente de 'grep' sería' $ idx = grep {$ array [$ _] eq 'whatever' y last} 0 .. $ # array; ', un poco peludo para mi gusto. Y luego está millas por delante en la carrera de velocidad, cuando se ejecuta como 'List :: Util :: XS'. – Zaid

2

Usted puede escribir una función para esto:

sub array_search { 
    my ($arr, $elem) = @_; 
    my $idx; 
    for my $i (0..$#$arr) { 
     if ($arr->[$i] eq $elem) { 
      $idx = $i; 
      last; 
     } 
    } 
    return $idx;    
} 

Se devolverá el índice del primer elemento coincidente, o undef.

+1

Mi solución final: sub array_search { my ($ element, @array) = @_; \t foreach (0 .. $ # array) { if (elemento $ $ [$ _] eq $) { return $ _; } } \t return -1; \t } – powerboy

10

Aquí hay una forma de hacerlo después de 5.10, con la ventaja adicional de determinar cuántos índices coinciden con el valor dado.

my @matches = grep { $array[$_] ~~ $element } 0 .. $#array; 

Si todos los elementos se garantiza que sea único, o simplemente el primer índice es de interés:

my ($index) = grep { $array[$_] ~~ $element } 0 .. $#array; 
+0

Esa respuesta no se ajusta a la pregunta. El índice es lo que entra dentro de los corchetes para el acceso a la matriz, entonces: un número entre '0' y' $ # array'. – daxim

+0

@daxim: ¿No estamos después del índice de los partidos aquí? – Zaid

+1

En realidad, la respuesta se ajusta a la pregunta, y muy bien. – masonk

6

Aquí es una solución autobox:

use autobox::Core; 

my @things = qw/blue black green red green yellow/; 

my $first_green = @things->first_index(sub{ $_[0] eq 'green' }); # code block 
my $last_green = @things->last_index (qr/^green$/);    # or regex 

say $first_green; # => 2 
say $last_green;  # => 4 
+2

upvote para autobox hilariousness – masonk

Cuestiones relacionadas