Как подсчет слов по назначению списка работает в Perl?
Я не могу точно понять, как работает следующий фрагмент:
my $str = 'abc def ghi';
my $num = () = $str =~ /\w+/g;
say $num; # prints the word count, 3
я знаю это $str =~ /\w+/g
возвращает список слов, который, по-видимому, передается самому левому назначению. потом$num
накладывает скалярный контекст на этот список и становится 3.
Но что значит () = ('abc', 'def', 'ghi')
жадный? Это что-то вродеmy $a = my @b = (3, 5, 8)
? Если да, то как список в правой части передается в$num
в крайнем левом углу?
2 ответа
Каждый оператор Perl имеет определенное поведение в контексте списка и скаляра. Операторы дают контекст своим операндам, но получают контекст от того, для чего они являются операндом. Когда назначение списка помещается в скалярный контекст, оно возвращает количество элементов в правой части назначения. Это позволяет использовать такой код:
while (my @pair = splice(@array, 0, 1)) {
Нет ничего особенного в том, как = () =
обрабатывается; ты мог бы так же хорошо сделать= ($dummy) =
или = (@dummy) =
; ключевая часть заключается в том, что вы хотите, чтобы совпадение было контекстом списка (производя все возможные совпадения), а затем просто получило их количество.
Итак, вы выполняете назначение списка (вот что =
выполняет всякий раз, когда в качестве левого операнда используется выражение в скобках, массив или фрагмент), но поскольку на самом деле вам не нужны значения, вы можете использовать пустой список. А затем поместите это в скалярный контекст; в этом случае, используя присвоение списка в качестве правого операнда для скалярного присвоения.
В настоящее время все меньше людей начинают изучать Perl, одна из причин заключается в том, что в нем есть непонятный код, подобный вашему примеру. Проверьте страницу perlsecret для Saturn https://metacpan.org/pod/distribution/perlsecret/lib/perlsecret.pod
=( )=
(Альтернативный псевдоним: "Сатурн")
Если вы не понимаете название этого оператора, считайте, что вам повезло. Не рекомендуется искать в Интернете наглядное объяснение.
Оператор goatse предоставляет контекст списка с правой стороны и возвращает количество элементов с левой стороны. Обратите внимание, что левая часть должна обеспечивать скалярный контекст; очевидно, что контекст списка слева получит пустой список посередине.
Объяснение состоит в том, что присвоение списка в скалярном контексте возвращает количество элементов в правой части присвоения, независимо от того, сколько из этих элементов было фактически присвоено переменным. В этом случае все элементы справа просто назначаются пустому списку (и поэтому отбрасываются).