我有一个Perl程序,可以在配置文件中存储正则表达式。它们的形式如下:
regex = ^/d+$
在其他地方,正则表达式从文件中解析并存储在变量 - $regex
中。
然后我在检查正则表达式时使用变量,例如
$lValid = ($valuetocheck =~ /$regex/);
我希望能够在配置文件中包含perl变量,例如
regex = ^\d+$stored_regex$
但我无法弄明白该怎么做。
当Perl解析正则表达式时,它们会被解释两次。 首先扩展变量,然后解析正则表达式本身。
我需要的是一个三阶段过程:
首先插入$regex
,然后插入它包含的变量,然后解析生成的正则表达式。
前两个插值都需要“正则表达式识别”。例如他们应该知道该字符串包含$
作为锚等...
有什么想法吗?
答案 0 :(得分:7)
您可以在配置文件中定义正则表达式,如下所示:
regex = ^\d+(??{$stored_regex})$
但是你需要在你使用正则表达式的块中禁用安全检查,方法是在你的Perl程序中执行此操作:
use re 'eval';
答案 1 :(得分:3)
使用eval可以为您提供帮助。看看下面的代码,它可以预编译一个准备用于后者的正则表达式:
my $compiled_regexp;
my $regexp = '^\d+$stored_regexp$';
my $stored_regexp = 'a';
eval "\$compiled_regexp = qr/$regexp/;";
print "$compiled_regexp\n";
运算符qr //可用于预编译正则表达式。它允许您构建它但尚未执行它。您可以先使用它构建regexp,然后再使用它们。
答案 2 :(得分:3)
您的Perl变量不在您的配置文件范围内,我认为这是一件好事。评估是可怕的。
你最好实现自己的模板。
所以在配置文件中:
regex = ^\d+__TEMPLATE_FIELD__$
在配置文件阅读器中:
# something like this for every template field you need
$regex =~ s/__TEMPLATE_FIELD__/$stored_regex/g;
使用时:
$lValid = ($valuetocheck =~ m/$regex/)
根据您希望模板替换应用的位置移动它们。
答案 3 :(得分:0)
与切线相关的问题:如果你进行内联双插值,并且变量中也有替换字符串,请考虑:
# the concat with doublequotes in the replacement string
# are to make them PART OF THE STRING, NOT THE STRING DELIMITERS,
# in other words, so the 2nd interpolation sees a double quoted string :
# eval eval $replace -> eval $1 hello world -> syntax error
# eval eval $replace -> eval "$1 hellow world" -> works ok
# see: http://www.perlmonks.org?node_id=687031
if($line =~ s/$search/'"' . $replace . '"'/ee) {
# STUFF...
}