Perl中数组中元素的索引

时间:2015-02-24 14:29:03

标签: perl

我正在尝试找到一种方法来获取数组中元素的索引,该元素与某个模式部分匹配。 假设我有一个值为

的数组
Maria likes tomatoes,
Sonia likes plums,
Andrew likes oranges

如果我的搜索字词是李子,我会将1作为索引返回。 谢谢!

2 个答案:

答案 0 :(得分:4)

快速搜索没有找到傻瓜,但我确信有一个。与此同时:

要查找满足特定条件的数组元素,请使用grep。如果你想要索引而不是元素..好吧,Perl 6添加了一个grep-index方法来处理这种情况,但在Perl 5中,最简单的方法是更改​​grep的目标。也就是说,不是在原始数组上运行它,而是在索引列表上运行它 - 只是使用引用原始数组的条件。在您的情况下,可能如下所示:

my @array = ( 'Maria likes tomatoes', 
              'Sonia likes plums', 
              'Andrew likes oranges');

grep { $array[$_] =~ /plums/ } 0..$#array;    # 1

相关位:

  • $#array返回@array的最后一个元素的索引。
  • m .. n m n (包括)之间生成一系列值;在列表上下文中,它成为这些值的列表。
  • grep { 代码 } list 返回 list 的元素 code 当特殊变量$_设置为元素时,>生成一个真值。

这些表达式从右到左最容易阅读。所以,首先我们生成原始数组(0..$#array)的所有索引的列表,然后我们使用grep来测试每个索引(由$_表示)以查看相应的元素@array$array[$_])匹配(~=)正则表达式/plums/

如果是,则该索引包含在grep返回的列表中;如果没有,它就被遗漏了。因此,最终结果是仅列出条件为真的索引的列表。在这种情况下,该列表仅包含值1。

已添加回复您的评论:请注意grep的返回值通常是匹配元素的列表,即使有只有一场比赛。如果将结果分配给数组(例如,使用my @indexes = grep ...),则数组将包含所有匹配的值。但是,grep是上下文相关的,如果你在标量上下文中调用它(例如通过将其返回值赋值为类似my $count = grep的标量变量...),你只会得到它一个数字,告诉你有多少场比赛。您可能希望在Perl中查看关于上下文敏感性的this tutorial

答案 1 :(得分:3)

这是来自List::MoreUtilsfirstidx

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;

use List::MoreUtils 'firstidx';

my @array = ('Maria likes tomatoes',
             'Sonia likes plums',
             'Andrew likes oranges');

say firstidx { /plums/ } @array;

更新:我看到draegtun已经回答了关于获取多个索引的评论。但我想知道为什么你不能只浏览List :: MoreUtils文档,看看那里是否有一个有用的功能。