$name="aAbBcCbB";
while($name =~ /bB/g){ # 将迭代两次
print "pre match: $` \n";
print "match: $& \n";
print "post match: $' \n";
}
为什么可以迭代,
$name迭代一次后,name不就消失了么
在Perl中,使用正则表达式的全局匹配修饰符 /g 时,匹配操作不会修改原始字符串 $name,而是通过内部的一个位置指针(pos) 来记录上次匹配结束的位置。每次匹配都从这个位置开始继续搜索,直到字符串末尾。
代码执行过程:
初始状态:
$name = "aAbBcCbB"
位置指针 pos($name) = 0(起始位置)
第一次迭代:
从位置 0 开始搜索 bB,在索引 2-3 处找到匹配。
输出:
$``(匹配前内容)→ "aA"
$&(匹配内容)→ "bB"
$'(匹配后内容)→ "cCbB"
更新位置指针:pos($name) = 4(匹配结束的下一个位置)
第二次迭代:
从位置 4 开始搜索,在索引 6-7 处找到下一个 bB。
输出:
$`` → "aAbBcC"
$& → "bB"
$' → ""(匹配后无内容)
更新位置指针:pos($name) = 8(字符串末尾)
循环结束:
位置指针超过字符串长度,匹配失败,循环终止。
关键点:
原始字符串不变:$name 始终是 "aAbBcCbB",从未被修改或消失。
位置指针机制:/g 修饰符通过 pos() 跟踪匹配进度,实现迭代。
特殊变量:
`$``:匹配前的子串
$&:匹配的子串
$':匹配后的子串
这些变量在每次匹配时动态更新。
输出结果:
text
pre match: aA
match: bB
post match: cCbB
pre match: aAbBcC
match: bB
post match: