Если бы мы попытались распечатать
В результате напечатается
a c
Если бы мы попытались распечатать "$1 $2 $3", то на печать вышло бы то же самое и еще предупреждение об использовании неинициализированной переменной (это $3).
Если бы мы вставляли значение переменной, которое содержит текст (b), то результат был бы тем же:
$_='abc'; my $a='(b)'; print "$1 $2" if /(a)(??{$a})(c)/;
Вот еще аналогичный вариант с объектом регулярного выражения, который выводит на печать то же самое:
$_='abc'; my $a=qr'(b)'; print "$1 $2" if /(a)(??{$a})(c)/;
Но как только мы попытаемся внутри всего регулярного выражения использовать одно динамическое регулярное выражение, содержащее захватывающие скобки, то Windows покажет окно с сообщением, что в Perl обнаружена ошибка и это приложение будет закрыто, при этом извиняясь за неудобство. Perl успевает вывести сообщение, что совпадение закончилось успешно. Эта ошибка возникает не только в Perl под Windows.
Вот эти фрагменты кода вызывают ошибку Perl:
$_='abc'; my $a='(b)'; /(??{$a})/;
$_='abc'; print 'Found' if /(??{"(b)"})/;
$_='abc'; my $a=qr'(b)'; print 'Found' if /(??{"$a"})/;
Странно, но в случае использования объекта регулярного выражения, когда внутри динамического регулярного выражения $a присутствует без кавычек, ошибки не возникает:
$_='abc'; my $a=qr'(b)'; print 'Found' if /(??{$a})/;
В остальных случаях Perl аварийно завершается. При использовании незахватывающих скобок:
$_='abc'; my $a='(?:b)'; /(??{$a})/;
все варианты работают нормально. Поэтому не создавайте захватывающих скобок внутри динамических регулярных выражений. Впрочем, возможно, в той версии Perl, которую имеете вы, это уже исправлено.
|
|
|
© 2003-2007 INTUIT.ru. Все права защищены. |
Содержание Назад
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий