2010-06-10 8 views

Antwort

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

Schönes Denken :)! – Geo

10

einen Blick auf List::MoreUtils nehmen. Sie können, ohne mit Arrays viele praktische Dinge tun, um Ihre eigene Version zu rollen, und es ist schneller (weil es in C/XS umgesetzt wird):

use List::MoreUtils qw(first_index indexes); 

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

Für alle passenden Indizes und ihre entsprechenden Elemente dann können Sie tun:

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

oder gerade:

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

Wird nicht nur der Index des ersten Elements zurückgegeben? – Geo

+0

Ja. Ich denke, Ether wollte die 'indexes'-Funktion verwenden, die eine Liste aller Indizes liefert, die für den Block wahr zurückgeben. – friedo

+0

Ja, das habe ich getan ... Ich habe mich zu früh gedrängt, bevor ich meine Arbeit überprüft habe. Danke :) – Ether

2

Diese auffüllt 2-Arrays mit dem, was Sie wollen, durch die Eingabe-Array Looping einmal:

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