【问题标题】:How to get the index of an element in an array?如何获取数组中元素的索引?
【发布时间】:2010-07-11 06:44:45
【问题描述】:

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

【问题讨论】:

  • 数组中有什么?搜索数组是一个危险信号,它让我评估是否可以使用更好的数据结构。请记住:哈希用于搜索!

标签: perl


【解决方案1】:
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 上)

【讨论】:

  • 这绝对是要走的路,10 次中有 9 次。
  • 为什么这比你的解决方案更好,Zaid?
  • @masonk :向后兼容之一。此外,first 将在找到匹配的索引后退出隐式循环。 grep 相当于 $idx = grep { $array[$_] eq 'whatever' and last } 0 .. $#array;,对我来说有点毛茸茸的。然后它在速度竞赛中领先几英里,以List::Util::XS 运行。
  • 刚刚意识到您无法将last 完全脱离grep。哎呀!
【解决方案2】:

这是一种 5.10 后的方法,其额外好处是确定有多少索引与给定值匹配。

my @matches = grep { $array[$_] ~~ $element } 0 .. $#array;

如果保证所有元素都是唯一的,或者只对第一个索引感兴趣:

my ($index) = grep { $array[$_] ~~ $element } 0 .. $#array;

【讨论】:

  • 那个答案不适合这个问题。索引是用于数组访问的方括号中的内容,因此:0$#array 之间的数字。
  • @daxim : 我们不是在匹配索引之后吗?
  • 其实,答案确实符合问题,而且非常好。
  • @Alexander:~~smart match operator。将其视为一个足够聪明的运算符,可以根据 LHS/RHS 数据类型找出您想要的内容。
【解决方案3】:

这是一个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

    【讨论】:

    • 我的最终解决方案:sub array_search { my ($element, @array) = @_; foreach (0..$#array) { if ($array[$_] eq $element) { return $_; } } 返回 -1; }
    猜你喜欢
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2021-08-17
    • 2020-06-30
    • 2022-08-16
    • 2014-12-15
    • 1970-01-01
    • 2012-11-15
    相关资源
    最近更新 更多