修饰符在使用qr运算符的声明中有什么影响?

时间:2014-01-23 09:51:53

标签: regex perl

佩尔多克说:

 qr/STRING/msixpodual

因此不允许使用g,这引出了我的问题:在qr运算符声明中添加修饰符会对该正则表达式的“字符串化”(如perldoc报告)版本做什么?

在我这样做的时候我一直在想的是我必须明确地使用g和我在声明之后添加的其他修饰符,如果它已经被qr提到过,它将是忽略。

my $var = qr /[A-Z]{1,2}/msix

然后在条件中我会使用

if ($string =~ /($var)/g )
  # work with match

1 个答案:

答案 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