Часто бывает полезно реализовать алгоритмы, используя операции вложенных массивов. Например, чтобы найти количество слов в списке, начинающемся с каждого заданного символа, вы можете сделать что-то вроде этого в 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')
Однако очевидная проблема заключается в том, что $_
относится только к самой внутренней переменной grep
итерации (подходит для $_
слева), а не к внешнему map
(подходит для /^$_/
). Каков идиоматический способ избежать этой проблемы в Perl?