Perl RE匹配:如何将变量用于RE标志?

时间:2015-05-15 18:42:57

标签: regex perl

Perl:

DerivedData

my $string = "This is a test"; say "String matches" if $string =~ /this is a test/; # Doesn't print say "String sort of matches" if string =~ /this is a test/i; # Prints 标志添加到RE匹配的末尾会导致匹配忽略大小写。

我有一个程序,我在其中指定要在单独的数据文件中匹配的正则表达式。这很好用。但是,我希望能够扩展它并能够指定在检查匹配时使用的正则表达式标志。

但是,在Perl中,那些RE标志不能是标量:

i

这导致:

my $re_flags = "i";
my $string = "This is a test";
say "This sort of matches" if $string =~ /this is a test/$re_flags;

在评估正则表达式时,有没有办法使用存储在标量变量中的RE标志?

我知道我可以使用Scalar found where operator expected at ,,, line ,,, near "/this is a test/$re_flags" (Missing operator before $re_flags?) syntax error at ... line ..., near "/this is a test/$re_flags" Execution of ... aborted due to compilation errors.

eval

但我想要一个更好的方法来做到这一点。

1 个答案:

答案 0 :(得分:9)

$ perl -E'say for qr/foo/, qr/foo/i'
(?^u:foo)
(?^ui:foo)

这只是表明

/foo/i
s/foo/bar/i

也可以写成

/(?i:foo)/
s/(?i:foo)/bar/

所以你可以使用

/(?$re_flags:foo)/
s/(?$re_flags:foo)/bar/

这仅适用于与正则表达式(a,d,i,l,m,p,s,u,x)相关的标志,而不适用于与匹配运算符有关的标志(c,g,o)或替代算子(c,e,g,o,r)。