编译正则表达式时,我可以捕获“无法识别的转义”警告吗?

时间:2009-05-20 19:42:10

标签: regex perl

我正在从配置文件中读取正则表达式,该文件可能包含也可能没有无效语法。 (它被锁定在防火墙后面,所以让我们不要进入安全状态。)我已经能够测试一些错误并给出一个友好的消息。

没有这样的运气:

  

Unrecognized escape \Q passed through in regex

我知道是什么导致它,我只是想知道我是否可以在Perl 5.8中捕获它。到目前为止,它一直拒绝我检查这种情况的努力。

所以问题是:有人知道如何捕获这个吗?我必须重定向STDERR吗?

3 个答案:

答案 0 :(得分:3)

你可以发出警告FATAL并使用block 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 :(得分:1)

以下是将此警告变为错误的方法:

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";

答案 2 :(得分:0)

由于这是一个警告,您还需要重定向STDERR

我的猜测是你收到了警告,因为你正在插入从配置文件中获得的正则表达式字符串 - 在使用之前在正则表达式字符串上尝试s/\\/\\\\/g