Как я также могу получить индекс элемента, когда я grep через массив? - PullRequest
9 голосов
/ 10 июня 2010

Допустим, у меня есть этот список:

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

и я хочу получить все элементы, содержащие o. Я бы получил это:

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

Но что мне нужно сделать, чтобы также получить индекс или получить доступ к индексу в теле grep?

Ответы [ 3 ]

16 голосов
/ 10 июня 2010

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 )
12 голосов
/ 10 июня 2010

Взгляните на Список :: 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 голосов
/ 10 июня 2010

Заполняет 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   , $_;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...