Могу ли я получить предупреждение «Нераспознанное побег» при компиляции регулярного выражения? - PullRequest
3 голосов
/ 20 мая 2009

Я читаю регулярное выражение из файла конфигурации, который может содержать или не содержать неверный синтаксис. (Он заблокирован за брандмауэром, поэтому давайте не будем вдаваться в безопасность.) Я смог проверить ряд ошибок и дать дружеское сообщение.

Не повезло:

Unrecognized escape \Q passed through in regex

Я знаю, чем это вызвано, я просто хочу знать, смогу ли я запечатлеть это в Perl 5.8. До сих пор он сопротивлялся моим попыткам проверить это состояние.

Так что вопрос: кто-нибудь знает, как это уловить? Нужно ли перенаправлять STDERR?

Ответы [ 3 ]

3 голосов
/ 21 мая 2009

Вы можете сделать предупреждение FATAL и использовать блок eval:

#!/usr/bin/perl

use strict;
use warnings;

my $s = '\M';

my $r = eval {
    use warnings FATAL => qw( regexp );
    qr/$s/;
};

$r or die "Runtime regexp compilation produced:\n$@\n";
1 голос
/ 21 мая 2009

Вот как превратить это предупреждение в ошибку:

sub un {
  local $SIG{__WARN__} = sub {
    die $_[0] if $_[0]=~/^Unrecognized escape /;
    print STDERR $_[0]
  };
  qr{$_[0]}
}
un('al\Fa');
print "Not reached.\n";

Вот как игнорировать это предупреждение:

sub un {
  local $SIG{__WARN__} = sub {
    print STDERR $_[0] if $_[0]!~/^Unrecognized escape /;
  };
  qr{$_[0]}
}
un('al\Fa');
print "Reached.\n";
0 голосов
/ 21 мая 2009

Поскольку это предупреждение, вам также необходимо перенаправить STDERR.

Полагаю, вы получаете предупреждение, потому что интерполируете строку регулярного выражения, полученную из файла конфигурации - попробуйте s/\\/\\\\/g в строке регулярного выражения перед ее использованием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...