Как я могу различить $ _ в операторах вложенного списка в Perl? - PullRequest
18 голосов
/ 13 февраля 2009

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

1 Ответ

21 голосов
/ 13 февраля 2009

Просто присвойте локальной переменной:

@a = qw(foo bar baz);
map {my $ch = $_; scalar grep $_ =~ /^$ch/, @a} qw(a b c d e f)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...