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

pow*_*boy 24 perl

Perl是否有内置函数来获取数组中元素的索引?或者我需要自己写这样的功能?[相当于PHP array_search()或JavaScript array.indexOf()]

hob*_*bbs 46

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

(List :: Util是核心)

要么

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

(List :: MoreUtils在CPAN上)

  • 这绝对是要走的路,10次中有9次. (2认同)
  • @masonk:向后兼容。同样,一旦找到匹配的索引,“ first”将退出隐式循环。“ grep”等价于“ $ idx = grep {$ array [$ _] eq'whatever'and last} 0 .. $#array;`,这对我来说有点毛茸茸。然后以`List :: Util :: XS`运行时,它在速度竞赛中领先一英里。 (2认同)

Zai*_*aid 11

这是一种5.10之后的方法,它具有确定与给定值匹配的索引数量的额外好处.

my @matches = grep { $array[$_] ~~ $element } 0 .. $#array;
Run Code Online (Sandbox Code Playgroud)

如果保证所有元素都是唯一的,或者只关注第一个索引:

my ($index) = grep { $array[$_] ~~ $element } 0 .. $#array;
Run Code Online (Sandbox Code Playgroud)


dra*_*tun 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
Run Code Online (Sandbox Code Playgroud)