perr中qr打印结果的含义

Qia*_* Li 7 regex perl

文档中,我看到了

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

但我不知道该怎么理解(?si-xm:...).如果我打印qr/quick|lazy/,我得到了(?-xism:quick|lazy).这也是什么意思(?-xism:...)

谢谢!

rua*_*akh 15

正如perlre man-page中所解释的那样:

任何字母之间?:作为标志修饰符[...]

前面的字母-是正修饰符; 那些之后是负面修饰语.因此,举例来说,(?-xism:quick|lazy)意味着空白和注释都没有允许的括号内,括号内的部分是区分大小写的,点.不会匹配换行符,并且^$匹配行开始和行结束.


hob*_*bbs 11

就像一个注释一样,(?FLAGS:pattern)perl 5.14.0 的语法已经发生了变化,并且regex strinigification随之改变.引用来自perlre:

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

(d是5.14中的一组新标志之一,它影响正则表达式如何受Unicode影响; d默认情况下,表示基本上像旧的Perl版本一样).

通过添加(?^FLAGS:pattern)语法,正则表达式字符串化将更改为使用此语法,并且仅列出与默认值不同的标志.因此将qr/hello/字符串化为(?^:hello)(以前(?-xism:hello))并将其qr/hello/i字符串化为(?^i:hello)(以前(?i-xsm:hello)).

这种改变的好处是,如果perl 5.16添加一个新的q正则表达式修饰符(用于"在量子计算机上运行此匹配"),qr/hello/则不必更改为字符串化(?d-xismq:hello)- 它将能够保持(?^:hello)原样5.14.