无法理解qr插值

Aru*_*ngh 1 regex perl

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

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

它说

在模式中启用了/ 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) 
Run Code Online (Sandbox Code Playgroud)

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

不说.是的,我知道是什么?i:意思,但我不确定是什么?^:意思?

sim*_*que 5

处理此问题的Perl文档章节称为perlre.在扩展模式匹配部分中,它解释了这一点.

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

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

这是一个更简单的例子:

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

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

say $second_re;
Run Code Online (Sandbox Code Playgroud)

这个输出是:

(?^i:bar(?^x:
foo # comment
))
Run Code Online (Sandbox Code Playgroud)

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

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

say 1 if 'BARFOO' =~ $second_re;
say 2 if 'BARfoo' =~ $second_re;
Run Code Online (Sandbox Code Playgroud)

这只会打印2.