while($name =~ /erw/){
print $&
}
这种没有加g参数,会死循环,一直打印erw,perl
$name =~ /erw/ 在标量上下文里 只进行一次匹配,而且 不会改变字符串内容。
每次循环条件都会重新执行同样的匹配,结果永远为真,于是 $& 永远是 "erw",循环永不结束。
不带 g/erw/
每次匹配都重新从字符串头开始,而且永远只找第一次出现的位置。
如果字符串本身不变,结果永远为真 → 死循环。
带 g/erw/g
会启动 “全局匹配游标”(pos 指针)。
第一次匹配成功后,游标停在匹配末尾。
下一次再遇到 /erw/g,引擎从游标处继续往后找。
当再也找不到时,返回假,并把游标重置到字符串开头(但本次循环已结束,while 条件为假退出)。
因此 while (/.../g) 会 依次扫完整串后自然退出。
while ($s =~ /erw/) { ... }
while ($s =~ /erw/g) { ... }