我正在阅读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:
的意思,
但我不确定?^:
是什么意思?
答案 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。