20

使用嵌套数组操作来实现算法通常很有用。例如,要查找列表中以每个给定字符开头的单词数,您可以在 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]

在表达式w.startswith(c)中,区分两个循环迭代变量很简单wc因为它们具有不同的名称。

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

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

但是,这样做的一个明显问题是,$_它只涉及最内层 grep的迭代变量(适用于$_左侧),而不是最外层的迭代变量(适用map/^$_/)。在 Perl 中避免这个问题的惯用方法是什么?

4

1 回答 1

25

只需分配给局部变量:

@a = qw(foo bar baz);
map {my $ch = $_; scalar grep $_ =~ /^$ch/, @a} qw(a b c d e f)
于 2009-02-12T22:22:18.690 回答