=〜如何在匹配中表现?

Jim*_*Jim 0 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  
Run Code Online (Sandbox Code Playgroud)

那么这是如何工作的呢?为什么它在非g模式下返回true/false?还是其他什么?

Lee*_*hem 8

perlop 已经给出了一个非常明确的解释,所以我将复制并粘贴它的相关部分:

对于=~运营商:

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

对于m//运营商:

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

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

如果/g不使用选项,m//在列表上下文返回由以模式,即括号匹配的子表达式的列表,( ,,$1 ...).如果模式中没有括号,则返回值是成功列表.有或没有括号,失败时返回一个空列表.$2$3(1)

对于m//用/g在列表上下文修改:

该/g修饰符指定全球模式匹配-也就是说,在字符串中匹配多次越好.它的行为取决于上下文.在列表上下文中,它返回正则表达式中任何捕获括号匹配的子字符串列表.如果没有括号,则返回所有匹配字符串的列表,就好像整个模式周围有圆括号一样.

在标量上下文中,每次执行都会m//g查找下一个匹配项,如果匹配则返回true,如果没有其他匹配项则返回false.


OP中表达式的上下文:

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

    m//g 在列表上下文中;

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

    m// 在列表上下文中;

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

    m// 在标量上下文中.