Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Функция 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

Ответ 2

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

use List::Util qw(first);

my @nums = ( '830974', '722065', '722046', '716963' );
my $index = first { $nums[$_] eq '722065' } 0..$#nums;

Ответ 3

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

#!/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.

Ответ 4

Если вам нужно только просмотреть один элемент, используйте 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;

Ответ 5

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

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

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

print $reverse{722065};

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

Ответ 7

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

Ответ 8

use strict;
use Data::Dumper;

sub invert
{
 my $i=0;
 map { $i++ => $_ } @_;
}

my @a = ('a','b','c','d','e');

print Dumper @a;

print Dumper invert @a;

Ответ 9

все в порядке, каждый был знаком с 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/'//+$=---$=;