qr/STRING/msixpodual
因此不允许使用g,这引出了我的问题:在qr运算符声明中添加修饰符会对该正则表达式的“字符串化”(如perldoc报告)版本做什么?
在我这样做的时候我一直在想的是我必须明确地使用g和我在声明之后添加的其他修饰符,如果它已经被qr提到过,它将是忽略。
my $var = qr /[A-Z]{1,2}/msix
然后在条件中我会使用
if ($string =~ /($var)/g )
# work with match
答案 0 :(得分:2)
某些标志会影响正则表达式模式。例如,s
会影响.
匹配的内容。可以使用(?flags)
和(?flags:...)
指定这些标记。所有接受正则表达式模式的内置运算符(qr//
,m//
和s///
)都接受这些标志。
某些标志会影响可以使用它们的操作员。例如,e
导致替换运算符将替换表达式视为代码而不是字符串文字。无法使用(?flags)
和(?flags:...)
指定这些标记。只有这些标志有意义的运营商才能接受这些标志。
让我们假设g
确实适用于qr//
。
my $re1 = qr/abc/; # Match once
my $re2 = qr/def/g; # Match globally
... $x =~ /$re1$re2/ ...
那会怎么做?这根本没有意义。
g
与正则表达式模式无关。您不能将g
仅应用于模式的一部分。 g
必然是运营商标志。
字符串化应该生成模式的准确表示,但标志是模式定义的一部分。因此,字符串化应包括标志。这是通过在(?flags:...)
中嵌入模式来完成的。
$ perl -E'say qr/abc/'
(?^u:abc) # Default flags
$ perl -E'say qr/abc/i'
(?^ui:abc) # Default flags plus "i"
$ perl -E'
$re1 = qr/a/;
$re2 = qr/b/i;
say $_, ": ", /$re1$re2/ ? 1 : 0 for qw( ab aB Aa AB );
'
ab: 1
aB: 1
Aa: 0
AB: 0