无法理解qr插值

时间:2015-06-16 07:44:34

标签: regex perl

我正在阅读Programming Perl,在那里我学习qr字符串插值为正则表达式:

$re = qr/my.STRING/is;
print $re;                  # prints (?si-xm:my.STRING)

它说

  

在模式中启用了/ s和/ i修饰符,因为它们是   提供给qr //。但是,/ x和/ m被禁用,因为它们   不是。

但是这个剧本:

#!/usr/bin/perl
use strict;
use warnings;
use re 'debug';



my  $re = qr/abc/si;
my $string = qr/foo${re}bar/;

print "$string \n";  #prints(?^:foo(?^si:abc)bar) 

为什么在我的第二个程序中添加了^,我在输入中没有明确地给出^,而这本书

没有说出来。是的,我知道?i:的意思, 但我不确定?^:是什么意思?

2 个答案:

答案 0 :(得分:5)

处理此问题的Perl文档的章节称为perlre。在extended pattern matching section中,它解释了这一点。

  

从Perl 5.14开始,立即出现“^”(插入符号或抑扬音)   之后 ”?”是d-imsx的简写。标志(“d”除外   )可以按照插入符覆盖它。但减号不合法   用它。

所以^不是字符串的开头。它用于子模式以启用修饰符而不是外部模式。

这是一个更简单的例子:

my $first_re = qr{
foo # comment
}x;

my $second_re = qr/bar$first_re/i;

say $second_re;

这个输出是:

(?^i:bar(?^x:
foo # comment
))

内部正则表达式$first_re在子模式/x中具有修饰符(?^x: ... )。它还包括评论和新行。 /x确保正确对待这些内容。

外部模式$second_re具有/i修饰符,但不是/x。内部不会继承/i

say 1 if 'BARFOO' =~ $second_re;
say 2 if 'BARfoo' =~ $second_re;

这只会打印2

答案 1 :(得分:3)

5.14.0中有一个更改添加了“默认修饰符”语法。请参阅perldelta