当我通过数组grep时,如何获得元素的索引?

时间:2010-06-10 16:39:02

标签: arrays perl grep

假设我有这个清单:

my @list = qw(one two three four five);

我想抓住包含o的所有元素。我有这个:

my @containing_o = grep { /o/ } @list;

但是我还需要做些什么才能获得索引,或者能够访问grep身体中的索引?

3 个答案:

答案 0 :(得分:16)

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 )

答案 1 :(得分:12)

看看List::MoreUtils。你可以使用数组做很多方便的事情,而不必滚动你自己的版本,而且它更快(因为它在C / XS中实现):

use List::MoreUtils qw(first_index indexes);

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

对于所有匹配的索引,然后是相应的元素,您可以执行以下操作:

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

或只是:

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

答案 2 :(得分:2)

这将使用您想要的内容填充2个数组,循环输入数组一次:

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