我正在阅读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:意思,但我不确定是什么?^:意思?
处理此问题的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.
| 归档时间: |
|
| 查看次数: |
62 次 |
| 最近记录: |