Если интерполируемые переменные, которые используются в операторе qr/…/, после трансляции им регулярного выражения изменят свое значение, то это не отразится на объекте регулярного выражения, даже если оператор qr/…/ не имеет модификатора o.
Рассмотрим такие примеры:
my $a=$_='ab'; my $re=qr"$a"; print "Found $&\n" if /$re/; $_=$a='cd'; print "Found $&\n" if /$re/;
Будет напечатано
Found ab
Во второй раз поиск закончился неудачей. Но если опять присвоить переменной $re значение qr"$a", то будет найдено и cd:
my $a=$_='ab'; my $re=qr"$a"; print "Found $&\n" if /$re/; $_=$a='cd'; $re=qr"$a"; print "Found $&\n" if /$re/;
Напечатается
Found ab Found cd
Если распечатать содержимое переменной, содержащей объект регулярного выражения, то на печать выйдет исходное регулярное выражение, отформатированное интерпретатором:
my $re=qr/ [a-z]+ # все буквы /x; print $re;
Напечатается
(?x-ism: [a-z]+ # все буквы )
Оператор qr/…/ полезен не только тем, что заранее компилирует регулярное выражение, которое потом применяется в готовом виде, но и тем, что позволяет строить большие и сложные регулярные выражения по кирпичикам. Например:
$_='ABCabc123'; my $re1=qr/[A-Z]+/; my $re2=qr/(\d+)/; print "$&\n$1\n$2" if /$re1([a-z]+)$re2/;
Напечатается
ABCabc123 abc 123
Если внутри какого-то объекта используются захватывающие скобки, то возникает сложность и неудобство при модификации такого регулярного выражения: ведь если впереди будет вставлена переменная или непосредственный текст регулярного выражения, который тоже содержит захватывающие скобки, то нарушится нумерация нумерованных переменных и обратные ссылки могут уже не соответствовать захватывающим скобкам, которые раньше были были их "родными". Например:
$_='abc111abc'; my $re1=qr/[a-z]+/; my $re2=qr/(\d+)\1/; print "$&\n$1" if /$re1$re2/;
Напечатается
abc11 1
А в случае
$_='abc111abc'; my $re1=qr/([a-z]+)/; my $re2=qr/(\d+)\1/; print "$&\n$1" if /$re1$re2/;