我对=~
运算符感到困惑。它似乎返回一个匹配的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?或者它是别的什么?
答案 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中表达式的上下文:
m//g
@zips = $var =~ /\d{5}/g;
;
m//g
@zips = $var =~ /\d{5}/;
;
m//
$zips = $var =~ /\d{5}/;
。
答案 1 :(得分:1)
$var =~ /(\d{5})/;
也会在列表上下文中返回匹配,只有/g
才会对()
括号进行分组。