2010-06-10 10 views

risposta

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

Bel pensiero :)! – Geo

10

Date un'occhiata a List::MoreUtils. Si può fare un sacco di cose a portata di mano con gli array senza dover rotolare la propria versione, in più è più veloce (perché è implementato in C/XS):

use List::MoreUtils qw(first_index indexes); 

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

Per tutti gli indici corrispondenti, e poi i loro elementi corrispondenti, è possibile fare:

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

o semplicemente:

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

Questo non restituirà solo l'indice del primo elemento? – Geo

+0

Sì. Penso che Ether intendesse usare la funzione 'indexes' che darà una lista di tutti gli indici che ritornano veri per il blocco. – friedo

+0

Sì, l'ho fatto ... Ho premuto Invio troppo presto prima di controllare il mio lavoro. grazie :) – Ether

2

Questo popola 2 campi con ciò che si vuole, scorrendo la matrice di ingresso una volta:

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 , $_; 
    } 
} 
Problemi correlati