Perl内置函数中是否有获取数组元素索引的功能?还是需要自己编写一个函数?(相当于PHP的array_search()或JavaScript的array.indexOf())
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上)
first
会在找到匹配的索引后退出隐式循环。相应的grep
语句为$idx = grep { $array[$_] eq 'whatever' and last } 0 .. $#array;
,但我不太喜欢这种写法。而且,当以List::Util::XS
方式运行时,速度要快得多。 - Zaidgrep
中使用 last
。哎呀! - Zaid这是一种5.10版本之后的方法,有额外的好处是可以确定有多少个索引与给定值匹配。
my @matches = grep { $array[$_] ~~ $element } 0 .. $#array;
如果所有元素都保证唯一,或者只关心第一个索引:my ($index) = grep { $array[$_] ~~ $element } 0 .. $#array;
0
和$#array
之间的数字。 - daximautobox
相关的解决方案: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
。
子程序数组搜索 {
my ($element, @array) = @_;
foreach (0..$#array) {
if ($array[$_] eq $element) {
return $_;
}
}
return -1;
}
- powerboy