Как работает подсчет слов по списку в Perl? - PullRequest
2 голосов
/ 28 апреля 2020

Я не могу точно понять, как работает следующий фрагмент:

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 ]

3 голосов
/ 28 апреля 2020

Каждый оператор perl имеет определенное поведение c в списке и скалярном контексте. Операторы задают контекст для своих операндов, но получают контекст из того, для чего они являются операндами. Когда список назначается в скалярном контексте, он возвращает количество элементов в правой части назначения. Это включает код вроде:

while (my @pair = splice(@array, 0, 1)) {

Нет ничего особенного в том, как обрабатывается = () =; с таким же успехом вы могли бы сделать = ($dummy) = или = (@dummy) =; ключевая часть в том, что вы хотите, чтобы совпадение было контекстом списка (производя все возможные совпадения), а затем просто получало их количество.

Итак, вы делаете присвоение списка (что и делает =). всякий раз, когда в качестве левого операнда есть выражение в скобках или массив или фрагмент), но так как вы на самом деле не хотите значений, вы можете использовать пустой список. И затем поместите это в скалярный контекст; в этом случае использование назначения списка в качестве правого операнда скалярного назначения.

2 голосов
/ 28 апреля 2020

В настоящее время все меньше людей начинают изучать Perl, одна из причин в том, что у него есть какой-то неясный код, подобный вашему примеру. Проверьте страницу perlsecret для Сатурна https://metacpan.org/pod/distribution/perlsecret/lib/perlsecret.pod#Goatse

=( )=

(Альтернативное прозвище: "Сатурн")

Если вы не понимаете Назовите этого оператора, считайте себя счастливчиком. Рекомендуется не искать Inte rnet для визуального объяснения.

Оператор goatse предоставляет контекст списка с правой стороны и возвращает количество элементов с левой стороны. Обратите внимание, что левая сторона должна обеспечивать скалярный контекст; очевидно, что контекст списка с левой стороны получит пустой список в середине.

Объяснение состоит в том, что назначение списка в скалярном контексте возвращает количество элементов в правой части назначения, нет независимо от того, сколько из этих элементов было фактически присвоено переменным. В этом случае все элементы справа просто присваиваются пустому списку (и поэтому отбрасываются).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...