$1
и $2
совпадающие переменные. Они ссылаются на то, что сопоставляется в различных скобках, соответствующих группам в последнем регулярном выражении.
$1
содержит часть строки, которая была найдена в группе скобок first . У $2
есть часть строки, которая была найдена в группе скобок second . Вы можете догадаться, что будет содержать $3
.
Давайте посмотрим на ваш пример:
$data = "What is the STATUS of your mind right now?";
$data =~/.*/; print "$1,$2\n";
Здесь нет скобок, поэтому $ 1 и $ 2 ничего не содержат.
$data =~/(.*?)(u+).*/; print "$1, $2\n";
Здесь есть две группы скобок. Первый - (.*?)
, который не соответствует ни чему, ни чему-либо возможному (не жадным образом, но это другая тема). Второй - (u+)
, который соответствует одному или нескольким * "u" * s.
Первое (и единственное) "u" в $data
находится в середине "you" , поэтому $1
соответствует каждому до первого "u" и $2
соответствует этому "u" .
$data =~/(.?)(u+).*/; print "$1, $2\n";
Теперь первая группа - (.?)
, которая соответствует одному отдельному символу или ничего. Затем (u+)
снова соответствует одному или нескольким * "u" * s.
Так как в нашей строке есть только один "u" , первая группа будет одним единственным символом перед ним, то есть "o" , а вторая группа будет соответствовать фактический "у"
$data =~/(\w+\s)+/; print "$1, $2\n";
Наконец, первая группа соответствует (\w+\s)+
, то есть одному или нескольким символам «слова», за которыми следует символ пробела. Символы «слово» - это любой буквенно-цифровой символ или знак подчеркивания. Второй группы нет, но есть символ +
(один или несколько).
Так чему же он соответствует? Это странно, и я не уверен, что мое понимание на 100% точно. Так как вся соответствующая группа имеет +
, она сожрет как можно большую часть строки и все равно будет соответствовать \w+\s
. В этом случае он может игнорировать все до «правильного» * 1058 *, которому затем соответствует $1
.
Тогда, поскольку он имеет +
, он будет искать больше совпадений сразу после этого, но, поскольку "right" - самая правая найденная строка, он никогда не найдет другое совпадение группы .
Так что $1
"правильно", а $2
пусто.
Резюме:
Когда вы видите $ 1 и $ 2, вы должны искать соответствующие скобки группы в последнем регулярном выражении.