В Perl, как я могу найти индекс данного значения в массиве? - PullRequest
14 голосов
/ 16 декабря 2009
$VAR1 = [
          '830974',
          '722065',
          '722046',
          '716963'
        ];

Как рассчитать индекс массива для значения "722065"?

Ответы [ 8 ]

33 голосов
/ 16 декабря 2009

Функция firstidx из Список :: 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
24 голосов
/ 16 августа 2010

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

use List::Util qw(first);

my @nums = ( '830974', '722065', '722046', '716963' );
my $index = first { $nums[$_] eq '722065' } 0..$#nums;
14 голосов
/ 16 декабря 2009

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

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

7 голосов
/ 16 декабря 2009

Если вам нужно найти только один предмет, используйте 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;
3 голосов
/ 16 декабря 2009

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

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

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

print $reverse{722065};

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

1 голос
/ 16 декабря 2009

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

0 голосов
/ 21 декабря 2010
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;
0 голосов
/ 16 декабря 2009

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