У меня есть:
my ($pid) = ($_ =~ m/^.*\.(\d+)$/);
Что $ Pid матчи?
У меня есть:
my ($pid) = ($_ =~ m/^.*\.(\d+)$/);
Что $ Pid матчи?
Вы не соответствуете $pid
here, но $_
Регулярное выражение - m/^.*\.(\d+)$/
. $pid
сохранит результат соответствия $_
с шаблоном регулярного выражения.
Вот объяснение регулярных выражений шаблона:
m/ # Delimiter
^ # Match beginning of string
.* # Match 0 or more repetition of any character except a newline
\. # Match a dot (.)
( # Start a capture group
\d+ # Match 1 or more repetition of digits.
) # Close capture group
$ # Match end of string
/
Таким образом, если значение в $_
соответствует указанной выше модели, $pid
будет содержать значение захваченного в захваченное первой группе, так как вы получили круглые скобки вокруг $pid
, поэтому ваша соответствующая операция будет оцениваться в контексте списка.
Ваше соответствие фактически то же самое, как:
# Note you can remove the `m`, if you use `/` as delimiter.
my ($pid) = /^.*\.(\d+)$/
Еще одна вещь, чтобы заметить, что, так как вы ничего не делаете с текста, совпавшего в самом начале, вы на самом деле не нужно, чтобы соответствовать этому. Таким образом, вы можете полностью удалить .*
, но в этом случае вам нужно удалить карет (^). Таким образом, ваше регулярное выражение теперь может быть заменено:
my $(pid) = /\.(\d+)$/
На самом деле, '$ pid' будет содержать первую группу захвата, так как круглые скобки вокруг' $ pid' сделать это задание списка, и поэтому '= ~' оценивается в контексте списка. –
@llmari. Упс. Пропустил это. –
Чтобы выбрать еще несколько nits, «предложение» выше должно быть «string», а '.' будет соответствовать любому символу _except_ новой строки (поскольку переключатель'/s' не используется). Это, наверное, ошибка. Предполагая, что это так, все это можно записать более компактно как «my ($ pid) = ($ _ = ~/\. (\ D +) $ /);' или даже просто 'my ($ pid) =/\ (\ d +) $ /;. '. Кроме того, '$' также может соответствовать позиции перед символом новой строки в конце строки. –