=〜如何在匹配中表现?

时间:2014-02-23 13:13:39

标签: regex perl

我对=~运算符感到困惑。它似乎返回一个匹配的true / false值。但是当使用g应用时,它会返回实际匹配 示例:

 ~
$ perl -e '  
my $var = "03824531449411615213441829503544272752010217443235";  
my @zips = $var =~ /\d{5}/g;  
print join "--", @zips;  
'
03824--53144--94116--15213--44182--95035--44272--75201--02174--43235  

$ perl -e '  
my $var = "03824531449411615213441829503544272752010217443235";  
my @zips = $var =~ /\d{5}/;  
print join "--", @zips;  
'  
1  

$ perl -e '  
my $var = "03824531449411615213441829503544272752010217443235";  
my $zips = $var =~ /\d{5}/;  
print join "--", $zips;  
'  
1  

那么这是如何工作的?为什么它在非g模式下返回true / false?或者它是别的什么?

2 个答案:

答案 0 :(得分:8)

perlop已经为此做了一个非常明确的解释,所以我只会复制&粘贴相关部分:

对于=~运营商:

  

二进制“=〜”将标量表达式绑定到模式匹配。 ...在标量上下文中使用时,返回值通常表示操作成功。 ...列表上下文中的行为取决于特定的运算符。有关详细信息,请参阅Regexp Quote-Like Operators;有关使用这些运算符的示例,请参阅perlretut

对于m//运营商:

  

在字符串中搜索模式匹配,在标量上下文中如果成功则返回true,如果失败则返回false。

对于列表上下文中没有m//修饰符的/g

  

如果未使用/g选项,则列表上下文中的m//将返回一个列表,其中包含与模式中括号匹配的子表达式,即($1,{{ 1}},$2 ...)。如果模式中没有括号,则返回值为成功列表$3。无论有没有括号,都会在失败时返回一个空列表。

对于列表上下文中(1)修饰符的m//

  

/g修饰符指定全局模式匹配 - 即在字符串中尽可能多地匹配。它的行为取决于上下文。在列表上下文中,它返回正则表达式中任何捕获括号匹配的子字符串列表。如果没有括号,则返回所有匹配字符串的列表,就好像整个模式周围有圆括号一样。

     

在标量上下文中,/g的每次执行都会找到下一个匹配项,如果匹配则返回true,如果没有进一步匹配则返回false。


OP中表达式的上下文:

  1. m//g

    列表上下文中的

    @zips = $var =~ /\d{5}/g;;

  2. m//g

    列表上下文中的

    @zips = $var =~ /\d{5}/;;

  3. m//

    标量上下文中的

    $zips = $var =~ /\d{5}/;

答案 1 :(得分:1)

$var =~ /(\d{5})/;也会在列表上下文中返回匹配,只有/g才会对()括号进行分组。