我有一個字符串,表示"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