Как я могу также получить индекс элемента когда я grep через массив?

Скажем, у меня есть этот список:

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

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

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

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

9
задан Ether 4 October 2010 в 19:20
поделиться

3 ответа

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 )
16
ответ дан 4 December 2019 в 07:22
поделиться

Посмотрите на 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;
12
ответ дан 4 December 2019 в 07:22
поделиться

Это заполняет 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   , $_;
    }
}
2
ответ дан 4 December 2019 в 07:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: