我正在从配置文件中读取正则表达式,该文件可能包含也可能没有无效语法。 (它被锁定在防火墙后面,所以让我们不要进入安全状态。)我已经能够测试一些错误并给出一个友好的消息。
没有这样的运气:
Unrecognized escape \Q passed through in regex
我知道是什么导致它,我只是想知道我是否可以在Perl 5.8中捕获它。到目前为止,它一直拒绝我检查这种情况的努力。
所以问题是:有人知道如何捕获这个吗?我必须重定向STDERR吗?
答案 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
。