如何在Perl中区分嵌套列表运算符中的$ _?

Gre*_*ill 18 arrays perl map

使用嵌套数组操作实现算法通常很有用.例如,要查找列表中以每个给定字符开头的单词数,您可以在Python中执行以下操作:

>>> a = ["foo","bar","baz"]
>>> map(lambda c: len(filter(lambda w: w.startswith(c), a)), ('a','b','c','d','e','f'))
[0, 2, 0, 0, 0, 1]
Run Code Online (Sandbox Code Playgroud)

在表达式中w.startswith(c),区分两个循环迭代变量w并且c因为它们具有不同的名称是微不足道的.

在Perl中,我想做这样的事情:

@a = ("foo", "bar", "baz");
map length(grep $_ =~ /^$_/, @a), ('a','b','c','d','e','f')
Run Code Online (Sandbox Code Playgroud)

然而,这个问题的明显问题$_是仅涉及最里面的 grep迭代变量(适用于$_左侧),而不是外部的map(适用于/^$_/).在Perl中避免此问题的惯用方法是什么?

Hyn*_*dil 21

只需分配给局部变量:

@a = qw(foo bar baz);
map {my $ch = $_; scalar grep $_ =~ /^$ch/, @a} qw(a b c d e f)
Run Code Online (Sandbox Code Playgroud)