如何获取数组中元素的索引?

37
Perl内置函数中是否有获取数组元素索引的功能?还是需要自己编写一个函数?(相当于PHP的array_search()或JavaScript的array.indexOf())

7
数组里面有什么?搜索数组是一个警示信号,让我评估是否可以使用更好的数据结构。记住:哈希表 是用于搜索的! - Greg Bacon
1
在Perl中,如何找到数组中给定值的索引? - FMc
4个回答

52
use List::Util qw(first);
$idx = first { $array[$_] eq 'whatever' } 0..$#array;

(List::Util是核心模块)

或者

use List::MoreUtils qw(firstidx);
$idx = firstidx { $_ eq 'whatever' } @array;

(List :: MoreUtils已在CPAN上)


2
这肯定是正确的方法,十有八九。 - Zaid
为什么这比你的解决方案更好,Zaid? - masonk
2
@masonk:首先是向后兼容性。此外,first会在找到匹配的索引后退出隐式循环。相应的grep语句为$idx = grep { $array[$_] eq 'whatever' and last } 0 .. $#array;,但我不太喜欢这种写法。而且,当以List::Util::XS方式运行时,速度要快得多。 - Zaid
刚刚意识到无法干净地从 grep 中使用 last。哎呀! - Zaid

15

这是一种5.10版本之后的方法,有额外的好处是可以确定有多少个索引与给定值匹配。

my @matches = grep { $array[$_] ~~ $element } 0 .. $#array;
如果所有元素都保证唯一,或者只关心第一个索引:
my ($index) = grep { $array[$_] ~~ $element } 0 .. $#array;

那个答案不符合问题。索引是用于数组访问的方括号中的内容,因此:一个介于0$#array之间的数字。 - daxim
@daxim:我们不是在寻找匹配项的索引吗? - Zaid
1
实际上,答案确实符合问题,并且非常好。 - masonk
@Alexander:~~智能匹配运算符。可以将其视为一种运算符,它足够聪明,可以根据左/右侧数据类型来确定您想要的内容。 - Zaid

6
这里是一个与autobox相关的解决方案:
use autobox::Core;

my @things = qw/blue black green red green yellow/;

my $first_green = @things->first_index( sub{ $_[0] eq 'green' } ); # code block
my $last_green  = @things->last_index ( qr/^green$/ );             # or regex

say $first_green;    # => 2
say $last_green;     # => 4

4
你可以写一个函数来实现这个功能:
sub array_search {
    my ($arr, $elem) = @_;
    my $idx;
    for my $i (0..$#$arr) {
        if ($arr->[$i] eq $elem) {
            $idx = $i;
            last;
        }
    }
    return $idx;            
}

将返回第一个匹配元素的索引,或undef


2
我的最终解决方案:子程序数组搜索 { my ($element, @array) = @_; foreach (0..$#array) { if ($array[$_] eq $element) { return $_; } } return -1; } - powerboy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接