【发布时间】:2010-07-11 06:44:45
【问题描述】:
Perl 是否有内置函数来获取数组中元素的索引?还是我需要自己写这样的功能? [相当于 PHP array_search() 或 JavaScript array.indexOf() ]
【问题讨论】:
-
数组中有什么?搜索数组是一个危险信号,它让我评估是否可以使用更好的数据结构。请记住:哈希用于搜索!
标签: perl
Perl 是否有内置函数来获取数组中元素的索引?还是我需要自己写这样的功能? [相当于 PHP array_search() 或 JavaScript array.indexOf() ]
【问题讨论】:
标签: perl
use List::Util qw(first);
$idx = first { $array[$_] eq 'whatever' } 0..$#array;
(List::Util 是核心)
或
use List::MoreUtils qw(firstidx);
$idx = firstidx { $_ eq 'whatever' } @array;
(列表::MoreUtils 在 CPAN 上)
【讨论】:
first 将在找到匹配的索引后退出隐式循环。 grep 相当于 $idx = grep { $array[$_] eq 'whatever' and last } 0 .. $#array;,对我来说有点毛茸茸的。然后它在速度竞赛中领先几英里,以List::Util::XS 运行。
last 完全脱离grep。哎呀!
这是一种 5.10 后的方法,其额外好处是确定有多少索引与给定值匹配。
my @matches = grep { $array[$_] ~~ $element } 0 .. $#array;
如果保证所有元素都是唯一的,或者只对第一个索引感兴趣:
my ($index) = grep { $array[$_] ~~ $element } 0 .. $#array;
【讨论】:
0 和 $#array 之间的数字。
~~ 是smart match operator。将其视为一个足够聪明的运算符,可以根据 LHS/RHS 数据类型找出您想要的内容。
这是一个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
【讨论】:
你可以为此编写一个函数:
sub array_search {
my ($arr, $elem) = @_;
my $idx;
for my $i (0..$#$arr) {
if ($arr->[$i] eq $elem) {
$idx = $i;
last;
}
}
return $idx;
}
将返回第一个匹配元素的索引,即undef。
【讨论】: