Perl:里面有变量的正则表达式?
有没有比这更优雅的将变量带入模式的方法(将模式放在字符串中,而不是直接在 // 中使用它)??
my $z = "1"; # variable
my $x = "foo1bar";
my $pat = "^foo".$z."bar$";
if ($x =~ /$pat/)
{
print "nokn";
}
回答
该qr运营商做它
my $pat = qr/^foo${z}bar$/;
除非分隔符是',在这种情况下它不会插入变量。
该运算符是提前构建模式的最佳方式,因为它构建了一个合适的正则表达式模式,接受了可以在正则表达式中的模式中使用的所有内容。它也需要修饰符,所以对于上面的一个可以写成
my $pat = qr/^foo $z bar$/x;
为了更清楚一点(但要小心省略那些{})。†
来自上述perlop链接的初始描述(示例和讨论如下):
qr/STRING/msixpodualn此运算符引用(并可能编译)其 STRING 作为正则表达式。STRING 的内插方式与 中的 PATTERN 相同
m/PATTERN/。如果使用“'”作为分隔符,则不进行变量插值。返回一个 Perl 值,可以用来代替相应的/STRING/msixpodualn表达式。返回值是原始模式的规范化版本。它与包含相同字符的字符串神奇地不同:ref(qr/x/)返回“Regexp”;但是,取消引用它并没有很好地定义(您当前获得原始模式的规范化版本,但这可能会改变)。
†一旦一个变量被插值,使用基于引用元的转义可能隐藏在其中的特殊字符可能是一个好主意,这可能会抛弃正则表达式Q ... E
my $pat = qr/^foo Q$zE bar$/x;
如果使用它,则变量名称也不需要分隔
my $pat = qr/^fooQ$zEbar$/;
感谢Håkon Hægland提出这个问题。