$VAR1 = [
'830974',
'722065',
'722046',
'716963'
];
Как я могу вычислить индекс массива для значения "722065"?
$VAR1 = [
'830974',
'722065',
'722046',
'716963'
];
Как я могу вычислить индекс массива для значения "722065"?
Функция 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
используя List::Util
, который является основным модулем, в отличие от List::MoreUtils
, который не является:
use List::Util qw(first);
my @nums = ( '830974', '722065', '722046', '716963' );
my $index = first { $nums[$_] eq '722065' } 0..$#nums;
Вот как вы найдете все позиции, в которых появляется заданное значение:
#!/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.
Если вам нужно только просмотреть один элемент, используйте 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;
Здесь поспешно написана попытка обратного поиска с использованием хеша.
my $VAR1 = [ '830974', '722065', '722046', '716963' ];
my %reverse;
$reverse{$VAR1->[$_]} = $_ for 0 .. @$VAR1 - 1;
print $reverse{722065};
Это не учитывает массивы с повторяющимися значениями. Я не одобряю это решение для производственного кода.
Ознакомьтесь с обсуждением perlmonks: http://www.perlmonks.org/?node_id=66003
ознакомьтесь с Perl FAQ
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;
все в порядке, каждый был знаком с 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/'//+$=---$=;