В Perl, как я могу найти индекс данного значения в массиве?

$VAR1 = [
          '830974',
          '722065',
          '722046',
          '716963'
        ];

Как я могу вычислить индекс массива для значения "722065"?

14
задан Igor Oks 16 December 2009 в 17:52
поделиться

7 ответов

Функция firstidx из List :: MoreUtils может помочь:

use strict;
use warnings;
use List::MoreUtils qw(firstidx);

my @nums = ( '830974', '722065', '722046', '716963' );
printf "item with index %i in list is 722065\n", firstidx { $_ eq '722065' } @nums;

__END__
item with index 1 in list is 722065
33
ответ дан 1 December 2019 в 05:51
поделиться

Вот как вы можете найти все позиции, в которых появляется данное значение:

#!/usr/bin/perl

use strict;
use warnings;

my @x = ( 1, 2, 3, 3, 2, 1, 1, 2, 3, 3, 2, 1 );
my @i = grep { $x[$_] == 3 } 0 .. $#x;
print "@i\n";

Если вам нужен только первый индекс, вы должны использовать List :: MoreUtils :: first_index .

14
ответ дан 1 December 2019 в 05:51
поделиться

Вот наспех написанная попытка обратного поиска с использованием хэша.

my $VAR1 = [ '830974', '722065', '722046', '716963' ];

my %reverse;
$reverse{$VAR1->[$_]} = $_ for 0 .. @$VAR1 - 1;

print $reverse{722065};

Это не учитывает массивы с повторяющимися значениями. Я не рекомендую это решение для производственного кода.

3
ответ дан 1 December 2019 в 05:51
поделиться

ознакомьтесь с FAQ по Perl

1
ответ дан 1 December 2019 в 05:51
поделиться

все в порядке, все были новичками в perl в какой-то момент

$ a - это элемент, индекс которого в @ list ...

my @list = (124124, 323, 156666, 124412, 3333, 4444444444, 124124124, 24412);
my $a = 4444444444;

print 
substr($_=($,=
chr($==39)).(
join$,,@list).$,,$=-$=,
index$_,$,.$a.$,)=~
tr/'//+$=---$=;
-7
ответ дан 1 December 2019 в 05:51
поделиться

Если вам нужно найти только один элемент, используйте firstidx , как говорили другие.

Если вам нужно сделать много поиски, построение индекса.

Если элементы вашего массива уникальны, построить индекс довольно просто. Но создать такой, который обрабатывает повторяющиеся элементы, не намного сложнее. Ниже приведены примеры обоих:

use strict;
use warnings;

use Data::Dumper;

# Index an array with unique elements.
my @var_uniq  = qw( 830974 722065 722046 716963 );
my %index_uniq  = map { $var_uniq[$_] => $_ } 0..$#var_uniq;

# You could use hash slice assinment instead of map:
# my %index_uniq;
# @index_uniq{ @var_uniq } = 0..$#var_uniq

my $uniq_index_of_722065   = $index_uniq{722065};
print "Uniq 72665 at: $uniq_index_of_722065\n";
print Dumper \%index_uniq;

# Index an array with repeated elements.
my @var_dupes = qw( 830974 722065 830974 830974 722046 716963 722065 );
my %index_dupes;
for( 0..$#var_dupes ) {
    my $item = $var_dupes[$_];

    # have item in index?
    if( $index_dupes{$item} ) {
        # Add to array of indexes
        push @{$index_dupes{$item}}, $_;
    }
    else {
        # Add array ref with index to hash.
        $index_dupes{$item} = [$_];
    }
}

# Dereference array ref for assignment:
my @dupe_indexes_of_722065 = @{ $index_dupes{722065} };

print "Dupes 722065 at: @dupe_indexes_of_722065\n";
print Dumper \%index_dupes;
7
ответ дан 1 December 2019 в 05:51
поделиться

с использованием List :: Util , который является основным модулем, в отличие от List :: MoreUtils , а не

use List::Util qw(first);

my @nums = ( '830974', '722065', '722046', '716963' );
my $index = first { $nums[$_] eq '722065' } 0..$#nums;
24
ответ дан 1 December 2019 в 05:51
поделиться
Другие вопросы по тегам:

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