2017-10-18 9 views
4

を使用して最後に出現するが、すべては"a/b/c/d/e"言うと、私は最後/を除くすべて置き換えたいです。すなわち、私の出力はa.b.c.d/eでなければなりません。代替は、私は、文字列を持っているperlの

どのように私は同じことを行うには、私の代替コマンドs/\//./gを変更するのですか?また、階層が必ずしも4 "/"を持つとは限りません。任意の数にすることができます。

+0

リマインダー、[誰かが私の質問に答えるとき、私は何をすべきか?]を参照してください(http://stackoverflow.com/help/someone-answers) – zdim

答えて

7

/がさらに文字列の下にある/をすべて置き換えます。それが最後の/

perl -wE'$_ = q(a/b/c/d/e); s{/(?=.*?/)}{.}g; say' 

を除くこれは何を消費することなく(.*?後)さらに下/の存在を主張するために、positive lookahead(?=...)を使用しています。


もう一つの方法は、最初のアプローチを否定文字クラスパターンでキャプチャ(およびその文字列にそれを戻す)と

s{/([^/]*)(?=/)}{.$1}g; 

しかし先読みでのみ固定文字列/を使用することです上には/と一致し、残りの部分については先読みが速くなることが分かりました。考えられる理由:([^/]*)アプローチでキャプチャ(と、それは文字列でそれをコピーバックする必要があります)最初のものは、単一の文字の上書きをしながら(.*?が後戻りしません)。

Benchmarkedに:126パーセントv5.10.1下速く、v5.27.2(デスクトップ)とv5.16.1(新しいサーバ)と110%。 4つのパスコンポーネントに対して4〜10文字の長い文字列でテストされています。これに注目するとの入力を求める、と、比較の上のコメントのためのikegami

感謝。

+0

この作業の理由おそらく、あなたは説明することができます。 – xxfelixxx

+0

@xxfelixxxはい、ありがとうございます。編集されました。 – zdim

+3

より効率的ですか? 's {/([)/]*)(?=/)}{.$ 1} g;' – ikegami

関連する問題