2013-07-04 4 views
-5

У меня есть:

my ($pid) = ($_ =~ m/^.*\.(\d+)$/); 

Что $ Pid матчи?

ответ

5

Вы не соответствуете $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+)$/ 
+0

На самом деле, '$ pid' будет содержать первую группу захвата, так как круглые скобки вокруг' $ pid' сделать это задание списка, и поэтому '= ~' оценивается в контексте списка. –

+0

@llmari. Упс. Пропустил это. –

+0

Чтобы выбрать еще несколько nits, «предложение» выше должно быть «string», а '.' будет соответствовать любому символу _except_ новой строки (поскольку переключатель'/s' не используется). Это, наверное, ошибка. Предполагая, что это так, все это можно записать более компактно как «my ($ pid) = ($ _ = ~/\. (\ D +) $ /);' или даже просто 'my ($ pid) =/\ (\ d +) $ /;. '. Кроме того, '$' также может соответствовать позиции перед символом новой строки в конце строки. –

Смежные вопросы