2010-06-10 12 views

Respuesta

15

 

my @index_containing_o = grep { $list[$_] =~ /o/ } 0..$#list; # ==> (0,1,3) 

my %hash_of_containing_o = map { $list[$_]=~/o/?($list[$_]=>$_):() } 0..$#list 
      # ==> ('one' => 0, 'two' => 1, 'four' => 3) 
+0

Nice thinking :)! – Geo

10

Tome un vistazo a List::MoreUtils. Usted puede hacer un montón de cosas utiles con matrices sin tener que rodar su propia versión, y además es más rápido (porque está implementado en C/XS):

use List::MoreUtils qw(first_index indexes); 

my $index_of_matching_element = first_index { /o/ } @list; 

Para todos los índices a juego, y luego sus elementos correspondientes, se puede hacer:

my @matching_indices = indexes { /o/ } @list; 
my @matching_values = @list[@matching_indices]; 

o simplemente:

my @matching_values = grep { /o/ } @list; 
+0

¿No devolverá esto solo el índice del primer elemento? – Geo

+0

Sí. Creo que Ether quería usar la función 'indexes' que dará una lista de todos los índices que devuelven verdadero para el bloque. – friedo

+0

Sí, lo hice ... Pulso enviar demasiado pronto antes de verificar mi trabajo. gracias :) – Ether

2

Este puebla 2 arrays con lo que quieres, de enlace a través de la matriz de entrada una vez:

use strict; 
use warnings; 
my @list = qw(one two three four five); 
my @containing_o; 
my @indexes_o; 
for (0 .. $#list) { 
    if ($list[$_] =~ /o/) { 
     push @containing_o, $list[$_]; 
     push @indexes_o , $_; 
    } 
} 
Cuestiones relacionadas