Часто полезно реализовать алгоритмы, используя операции с вложенными массивами. Например, чтобы найти количество слов в списке, которые начинаются с каждого данного символа, вы можете сделать что-то подобное в 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)
несущественно различать две переменные итерации цикла w
и c
, поскольку они имеют разные имена.
В Perl я хотел бы сделать что-то вроде этого:
@a = ("foo", "bar", "baz");
map length(grep $_ =~ /^$_/, @a), ('a','b','c','d','e','f')
Однако очевидная проблема заключается в том, что $_
относится только к самой внутренней итерационной переменной 1014 * grep
(подходит для $_
слева), а не к внешней map
(подходит для /^$_/
). Какой идиоматический способ избежать этой проблемы в Perl?