Как добавить модификатор в регулярное (qr) выражение в кавычках - PullRequest
6 голосов
/ 10 ноября 2011

Есть ли простой способ добавить модификаторы регулярных выражений, такие как 'i', в регулярное выражение в кавычках? Например:

$pat = qr/F(o+)B(a+)r/;
$newpat = $pat . 'i'; # This doesn't work

Единственный способ, которым я могу придумать, это print "$pat\n" и вернуться (?-xism:F(o+)B(a+)r) и попытаться удалить 'i' в ?-xism: с подстановкой

Ответы [ 3 ]

6 голосов
/ 10 ноября 2011

Вы не можете поместить флаг в результат qr, который у вас уже есть, потому что он защищен.Вместо этого используйте это:

$pat = qr/F(o+)B(a+)r/i;
2 голосов
/ 11 ноября 2011

Вы можете изменить существующее регулярное выражение, как если бы оно было строкой, до тех пор, пока вы его перекомпилируете

  my $pat = qr/F(o+)B(a+)r/;
  print $pat, "\n";
  print 'FOOBAR' =~ $pat ? "match\n" : "mismatch\n";

  $pat =~ s/i//;
  $pat = qr/(?i)$pat/;
  print $pat, "\n";
  print 'FOOBAR' =~ $pat ? "match\n" : "mismatch\n";

OUTPUT

  (?-xism:F(o+)B(a+)r)
  mismatch
  (?-xism:(?i)(?-xsm:F(o+)B(a+)r))
  match
1 голос
/ 11 ноября 2011

Похоже, что единственный способ состоит в том, чтобы привести в порядок RE, заменить (-i) на (i-) и повторно заключить его в кавычки:

my $pat = qr/F(o+)B(a+)r/;
my $str = "$pat";
$str =~ s/(?<!\\)(\(\?\w*)-([^i:]*)i([^i:]*):/$1i-$2$3:/g;
$pati = qr/$str/; 

ОБНОВЛЕНИЕ: perl 5.14 цитирует регулярные выражения в по-другому , поэтому мой пример должен выглядеть примерно так:

my $pat = qr/F(o+)B(a+)r/;
my $str = "$pat";
$str =~ s/(?<!\\)\(\?\^/(?^i/g;
$pati = qr/$str/;

Но у меня нет perl 5.14 под рукой и я не могу его протестировать.

UPD2: мне также не удалось проверить открывающуюся скобку.

...