我在=~操作员中感到困惑.它似乎返回一个匹配的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?还是其他什么?
perlop 已经给出了一个非常明确的解释,所以我将复制并粘贴它的相关部分:
对于=~运营商:
二进制"=〜"将标量表达式绑定到模式匹配....在标量上下文中使用时,返回值通常表示操作成功....列表上下文中的行为取决于特定的运算符.有关详细信息和使用这些运算符的示例,请参阅Regexp Quote-Like Operators
perlretut.
对于m//运营商:
在字符串中搜索模式匹配,在标量上下文中,如果成功则返回true,如果失败则返回false.
对于列表上下文中m//没有/g修饰符:
如果
/g不使用选项,m//在列表上下文返回由以模式,即括号匹配的子表达式的列表,( ,,$1...).如果模式中没有括号,则返回值是成功列表.有或没有括号,失败时返回一个空列表.$2$3(1)
对于m//用/g在列表上下文修改:
该
/g修饰符指定全球模式匹配-也就是说,在字符串中匹配多次越好.它的行为取决于上下文.在列表上下文中,它返回正则表达式中任何捕获括号匹配的子字符串列表.如果没有括号,则返回所有匹配字符串的列表,就好像整个模式周围有圆括号一样.在标量上下文中,每次执行都会
m//g查找下一个匹配项,如果匹配则返回true,如果没有其他匹配项则返回false.
OP中表达式的上下文:
@zips = $var =~ /\d{5}/g;
m//g 在列表上下文中;
@zips = $var =~ /\d{5}/;
m// 在列表上下文中;
$zips = $var =~ /\d{5}/;
m// 在标量上下文中.