首页 新闻 会员 周边 捐助

perl: $name迭代一次后,name不就消失了么

0
[已关闭问题] 关闭于 2025-07-24 15:44

$name="aAbBcCbB";

while($name =~ /bB/g){ # 将迭代两次
print "pre match: $` \n";
print "match: $& \n";
print "post match: $' \n";
}

为什么可以迭代,
$name迭代一次后,name不就消失了么

_java_python的主页 _java_python | 小虾三级 | 园豆:984
提问于:2025-07-24 15:43
< >
分享
所有回答(1)
0

在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:

_java_python | 园豆:984 (小虾三级) | 2025-07-24 15:44
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册