我正在尝试找到一种方法来获取数组中元素的索引,该元素与某个模式部分匹配。 假设我有一个值为
的数组Maria likes tomatoes,
Sonia likes plums,
Andrew likes oranges
如果我的搜索字词是李子,我会将1作为索引返回。 谢谢!
答案 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
的最后一个元素的索引。 ..
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::MoreUtils的firstidx
。
#!/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文档,看看那里是否有一个有用的功能。