Подтвердить что ты не робот

Как я могу отличить $_ от операторов вложенных списков в Perl?

Часто бывает полезно реализовать алгоритмы, используя операции вложенных массивов. Например, чтобы найти количество слов в списке, начинающемся с каждого заданного символа, вы можете сделать что-то вроде этого в 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?

4b9b3361

Ответ 1

Просто назначьте локальную переменную:

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