Perl 获取数组';s索引作为smartmatch操作的结果?

Perl 获取数组';s索引作为smartmatch操作的结果?,perl,Perl,是否有方法获取通过使用smartmatch运算符(~)在标量和数组之间进行比较而得到的匹配索引 如果存在匹配项,条件中的表达式将返回true,因此这没有任何帮助 在非常简单的情况下,我确实喜欢smartmatch操作符;我不会在数据结构与数据结构或其他疯狂的比较中使用它。我会使用装饰器。根据上下文,可以更紧凑地编程,但总体思路如下: my $i = 0; my @matches = map { $_->[0] } grep { $_->[1] eq $str }

是否有方法获取通过使用smartmatch运算符(
~
)在标量和数组之间进行比较而得到的匹配索引

如果存在匹配项,条件中的表达式将返回true,因此这没有任何帮助


在非常简单的情况下,我确实喜欢smartmatch操作符;我不会在数据结构与数据结构或其他疯狂的比较中使用它。

我会使用装饰器。根据上下文,可以更紧凑地编程,但总体思路如下:

my $i = 0;
my @matches =
    map  { $_->[0] }
    grep { $_->[1] eq $str }
    map  { [ $i++, $_ ] } @data;

if (@matches) {
    # ...
}

我在文档中看不到任何方法(
perldoc-perlop

:


不要使用smartmatch。该公司表示,smartmatch系列功能目前处于实验阶段:“不建议依赖其当前行为。”@Borodin:如果一个人永远不应该使用实验功能,那么拥有它们就没有意义了。更好地说,在使用它之前,你应该意识到…@ysth:实验功能应该用于实验。我认为,假设SO上发布的问题是关于生产软件的,这是公平的,除非海报上明确说明了其他内容。用Perl的说法,“装饰排序-取消装饰”模式被称为“Schwartzian变换”。在排序算法中,缓存排序索引而不是为每次比较重新计算排序索引会更便宜。但在这里,您只需执行一个简单的
grep
,不保存任何内容(甚至不保存数组访问)。相反:
my@matches=grep{$data[$\]eq$str}0$#data
@amon这是我在提交后直接想到的,但OP已经解决了他的问题。谢谢你。
my $i = 0;
my @matches =
    map  { $_->[0] }
    grep { $_->[1] eq $str }
    map  { [ $i++, $_ ] } @data;

if (@matches) {
    # ...
}
use warnings;
use strict;
use List::MoreUtils qw(firstidx);

my @data = qw(red white blue green);
my $i = firstidx { $_ eq 'blue' } @data;
print "$i\n";

__END__

2