Я пытаюсь сопоставить строку вроде (что-то что-то).
$_ = "anna is ann"; if (/([a-zA-Z]+) is \1/) { print "matched\n"; }
Я ожидал, что это не сработает, но работает. Почему?
Соответствует 6 символам, начиная с позиции 3 (a is a). Возможно, вам следовало использовать
a is a
/^([a-zA-Z]+) is \1\z/
[a-zA-Z]+
is
\1
Попробуйте print $1; или print $&; - /([a-zA-Z]+) is \1/ соответствует подстроке a is a anna is ann. Если вы хотите ограничить совпадение, вы можете привязать начало и / или конец строки (или строки в /m) с помощью ^ соответственно. $, или используйте границу слова \b, если вы хотите найти соответствие в более длинной строке. Итак:
print $1;
print $&;
/([a-zA-Z]+) is \1/
anna is ann
/m
^
$
\b
/^([a-zA-Z]+) is \1$/ будет соответствовать "anna is anna", но не "anna is ann" или "anna is anna ".
/^([a-zA-Z]+) is \1$/
"anna is anna"
"anna is ann"
"anna is anna "
/\b([a-zA-Z]+) is \1\b/ будет соответствовать "x anna is anna y" и "sue-ann is ann-marie", но не "anna is ann", "anna is anne" или "anna is annabelle".
/\b([a-zA-Z]+) is \1\b/
"x anna is anna y"
"sue-ann is ann-marie"
"anna is anne"
"anna is annabelle"