Регулярные выражения Perl и их применение


         

Интерполяция переменных и кода в регулярне выражение - часть 3


На печать выйдет 23.

После интерполяции регулярное выражение будет иметь вид /^[23]{2}$/.

Разумеется, в классы интерполируются также и переменные, содержащие метасимволы классов:

$_='123abc'; my $a='^\d'; print $& if /[$a]+/;

Будет напечатано abc.

После интерполяции регулярное выражение будет иметь вид /[^\d]+/.

При попытке интерполировать неопределенное значение появится предупреждение об использовании неинициализированного значения:

#!/usr/bin/perl -w use strict;

$_='z'; my $a=undef; /^$a$/;

Будет напечатано:

Use of uninitialized value in concatenation (.) or string at a.pl line 6.

Если мы хотим интерполировать внутрь строки значение переменной $n, то просто напишем "\$n=$n text". А если надо интерполировать не число $n, а число $n+1 или другое выражение, тогда как? Можно, конечно, написать так: "\$n+1=".($n+1)." text", но это не будет интерполяция внутрь строки. Здесь можно прибегнуть к рассмотренному приему интерполяции кода внутрь строки: "\$n+1=${\($n+1)} text". Аналогично можно интерполировать выражения внутрь регулярных выражений. К примеру, если мы вместо квантификатора хотим использовать значение переменной $n, то напишем

$_='a'; my $n=1; /^(a{$n})$/; print $1;

Напечатается a.

Если хотим, к примеру, использовать квантификатор со значением $n+1, то можно написать так:

$_='aa'; my $n=1; /^(a{${\($n+1)}})$/; print $1;

Напечатается aa.




Содержание  Назад  Вперед