回答:
ここにいくつかのオプションがあります:
Perlでは、代替の区切り文字を選択できます。に限定されていませんm//
。など、別のものを選択できますm{}
。その後、エスケープする必要はありません。実際のところ、「Perlベストプラクティス」のDamian Conway m{}
は、これが使用すべき唯一の代替デリミタであることを主張しており、これはPerl :: Critic(CPAN上)によって強化されています。あなたは、代替区切り文字のさまざまな方法を使って逃げる、することができますが//
と{}
に後で解読する最も明確であるように見えます。ただし、これらの選択のいずれかによりエスケープが大きくなりすぎる場合は、読みやすさに最も適した方を選択してください。一般的な例でありm(...)
、m[...]
とm!...!
。
代替デリミタを使用できないか、使用したくない場合はm/\/[^/]+$/
、たとえば、バックスラッシュでスラッシュをエスケープ できm{/[^/]+$}
ます。バックスラッシュでスラッシュをエスケープすることは、名前とウィキペディアのページを獲得するのに十分一般的です:傾いたつまようじ症候群。単一のインスタンスしかない正規表現では、スラッシュをエスケープしても、読みやすさの妨げと見なされるレベルにはならない場合がありますが、スラッシュが手に負えなくなり、Perlのように言語が代替の区切り文字を許可している場合は、推奨されるソリューションです。
perl -pi -e "s/chdir .*/chdir $ROBOT_PATH/g" startup_scripts/supervisord.conf
そして、私はフォワードスラッシュと衝突しています。
perl -pi -e "s{chdir .*}{chdir $ROBOT_PATH}g" startup_scripts/supervisord.conf
...しかし、これはおそらくより良いですperl -pi -e 's/chdir .*/chdir $ENV{ROBOT_PATH}/g' startup_scripts/supervisord.conf
。シェルの補間を回避するためです。
/
文字をエスケープする代わりに、16進数または8進数のASCIIエンコーディングで文字を指定する正規表現機能を使用することもできます。Perlは8進形式\57
(source regular-expressions.info/refcharacters.html)を受け入れます
バックスラッシュを使用する\
か、別の区切り文字を選択します。つまりm#.\d#
、/.\d/
「Perlでは、/正規表現の区切り文字の前に文字m(一致)を付けると、ほとんどすべての特殊文字に変更できます。」