我有一个字符串,表示"a/b/c/d/e"
,我想将除最后的/
之外的所有字符替换为。即我的输出应该是a.b.c.d/e
。使用perl代替除最后一次出现以外的任何地方
如何修改我的替代命令s/\//./g
来做同样的事情?另请注意,层次结构并不总是有4个“/
”。它可以是任何数字。
我有一个字符串,表示"a/b/c/d/e"
,我想将除最后的/
之外的所有字符替换为。即我的输出应该是a.b.c.d/e
。使用perl代替除最后一次出现以外的任何地方
如何修改我的替代命令s/\//./g
来做同样的事情?另请注意,层次结构并不总是有4个“/
”。它可以是任何数字。
替换全部/
,其中有一个/
进一步向下;排除最后/
perl -wE'$_ = q(a/b/c/d/e); s{/(?=.*?/)}{.}g; say'
这使用positive lookahead,(?=...)
,断言的/
存在进一步下跌(.*?
后),而无需消耗任何东西。
另一种方法是捕捉一个否定的字符类模式(然后把那后面的字符串)和先行只使用固定字符串/
s{/([^/]*)(?=/)}{.$1}g;
然而,第一种方法上面有一个/
比赛,其余的比较快,可能的原因是:在([^/]*)
方法中捕获(并且必须将其复制回字符串中),而第一个字符覆盖单个字符(.*?
不回溯)。
基准测试:在v5.10.1和v5.27.2(桌面)下快126%,在v5.16.1(新服务器)下高110%。使用4-10字符长的字符串测试四个路径组件。
感谢ikegami注意到这一点,并提示和评论比较。
提醒,请参阅[我应该怎么做当有人回答我的问题?](http://stackoverflow.com/help/someone-answers) – zdim