2009-02-12 65 views
19

使用嵌套数组操作实现算法通常很有用。例如,要查找单词的列表,每个给定的字符开始数,你可以做这样的事情在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中避免这个问题的惯用方法是什么?

回答

21

只是分配给本地变量:

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

优秀的,这就行了。也感谢提醒使用标量而不是长度! – 2009-02-12 22:25:43