a *表示零个或多个实例:一个权利?
所以为什么$ _ =“a”; s / a * / e / g产生:ee
可能的答案:它替换字符串:“a”替换为:“e”,它替换空字符串:“”::“e”。或者它代替了纯粹的缺少字母:a用字母:e或它替代了“零出现”:a with an:e
好吧,但是:
$ _ =“b”; s / a * / e / g产生:ebe
它似乎是将空字符串替换为:b的左边,以及下面的右边的空字符串:b
好。但是为什么不这样做:“a”?为什么不把空字符串替换为左边的a,还有一个空字符串在右边:a和字母:a本身得到:eee?
有多少零次出现:a在左侧作为右侧!
解决方法
您对为什么结果是“ee”和“ebe”的分析是完全准确的。
“/ g”修饰符导致正则表达式匹配一次,然后尝试从最后一个匹配停止的位置再次匹配。
出现差异的原因(它不会替换“a”左边的空字符串)是因为“*”是贪婪的 – 它与MOST可能的字符匹配。从perldoc perlre
:
By default,a quantified subpattern is “greedy”,that is,it will match as many times as possible (given a particular starting location) while still allowing the rest of the pattern to match.
所以它匹配零“a”,看看它是否可以匹配更多。由于在字符串中有更多的“a”,它将匹配一个。尝试匹配更多。没有?完成。所以我们匹配第一个“a”。
然后,“/ g”使我们再次尝试匹配(从上次匹配完成后我们停止的位置开始),现在匹配空(零“a”)字符串。