значение выражения оператора связывания в perl - PullRequest
0 голосов
/ 10 января 2019

У меня есть некоторые сомнения относительно результата выражения оператора привязки в perl. Я имею в виду выражение как

string =~ /pattern/

Я сделал простой тест

$ss="a1b2c3";
say $ss=~/a/;   # 1
say $ss=~/[a-z]/g;  # abc
@aa=$ss=~/[a-z]/g;say @aa;  # abc
$aa=@aa;say $aa;    # 3
$aa=$ss=~/[a-z]/g;say $aa;  # 1

обратите внимание, что часть комментария выше является текущим результатом.

Итак, возникает вопрос, что же возвращает $ss=~/[a-z]/g, похоже, он вернул массив в соответствии со строкой кода 3,4,5. Но как насчет последней строки, почему она дает 1 вместо 3, что является длиной массива?

1 Ответ

0 голосов
/ 10 января 2019

Возвращение оператора сопоставления зависит от контекста: в контексте списка он возвращает все захваченные совпадения, в скалярном контексте - true / false. say накладывает контекст списка, но в первом примере в регулярном выражении ничего не фиксируется, поэтому вы получаете только «success».

Далее, поведение модификатора /g также отличается в зависимости от контекста. В контексте списка, при этом строка продолжает сканироваться с заданным шаблоном, пока не будут найдены все совпадения, и не будет возвращен список с ними. Это ваши второй и третий примеры.

Но в скалярном контексте его поведение немного специфично: с ним поиск будет продолжен с позиции последнего совпадения, следующего раунда. Одно из типичных применений в состоянии цикла

while (/(\w+)/g) { ... }

Это что-то вроде токенизатора: после запуска тела цикла будет найдено следующее слово и т. Д.

Тогда последний пример на самом деле не имеет смысла; вы получаете «нормальное» совпадение скалярного контекста: успех / неудача, и /g ничего не делает - пока вы не совпадете с $ss в следующий раз

perl -wE'
    $s=shift||q(abc); 
    for (1..2) { $m = $s=~/(.)/g; say "$m: $1"; }
'

печатает строки 1:a, а затем 1:b.

За пределами итеративных структур (например, while условие) /g в скалярном контексте обычно является ошибкой, в лучшем случае бессмысленной или тихой ошибкой.

См. " Глобальное соответствие " в разделе "Использование регулярных выражений" в perlretut для /g. См. операторы регулярных выражений в perlop в целом и около /g. Полезный инструмент для изучения /g работает: pos .

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