Answers:
以下是一些选择:
在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
因为它避免了外壳插值。
/
字符的替代方法是使用正则表达式功能,该功能通过十六进制或八进制的ASCII编码指定字符。Perl的接受八进制形式\57
(源regular-expressions.info/refcharacters.html)
使用反斜杠\
或选择其他定界符,即m#.\d#
代替/.\d/
“在Perl中,如果您将字母m开头(用于匹配),则可以将/正则表达式定界符更改为几乎任何其他特殊字符;”