在 Perl 中,如何找到数组中给定值的索引?

问题描述 投票:0回答:7
$VAR1 = [
          '830974',
          '722065',
          '722046',
          '716963'
        ];

如何计算值“722065”的数组索引?

perl arrays
7个回答
33
投票

来自

List::MoreUtils
firstidx 函数可以提供帮助:

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;

输出:

item with index 1 in list is 722065

26
投票

使用

List::Util
,这是一个核心模块,与
List::MoreUtils
不同,它不是:

use List::Util qw(first);

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

15
投票

以下是找到给定值出现的所有位置的方法:

#!/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
投票

如果您只需要查找一项,请像其他人所说的那样使用

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
投票

这是使用哈希进行反向查找的仓促编写的尝试。

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

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

print $reverse{722065};

这不考虑具有重复值的数组。我不认可此解决方案用于生产代码。


1
投票

0
投票
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;
© www.soinside.com 2019 - 2024. All rights reserved.