Regex perl中的s[][]表示法
我在模块的Regex perl中的s[][]表示法,regex,perl,Regex,Perl,我在模块的cpan文档中看到了这段perl代码: $filename =~ s[^.+/][]; 这是什么意思?我已经习惯了s/函数的s/符号。它只是一个可选的模式分隔符。根据模式的详细信息(特别是,如果模式中有斜杠),如果使用斜杠以外的东西作为分隔符,则人类可能更容易解析表达式。在这种情况下,它有点边缘化,但如果使用斜杠,它将如下所示: $filename =~ s/^.+\///; 您可以立即看到,很难确定哪些斜线是模式的一部分,哪些斜线界定了模式。在这种情况下,最后的第三个斜杠是模式的
cpan
文档中看到了这段perl
代码:
$filename =~ s[^.+/][];
这是什么意思?我已经习惯了
s/
函数的s/
符号。它只是一个可选的模式分隔符。根据模式的详细信息(特别是,如果模式中有斜杠),如果使用斜杠以外的东西作为分隔符,则人类可能更容易解析表达式。在这种情况下,它有点边缘化,但如果使用斜杠,它将如下所示:
$filename =~ s/^.+\///;
您可以立即看到,很难确定哪些斜线是模式的一部分,哪些斜线界定了模式。在这种情况下,最后的第三个斜杠是模式的一部分,将被解释为结束模式,因此必须进行转义。Perl允许将任何非空白字符用作字符串分隔符。看 括号字符成对使用,如
,[…]
,(…)
,和{…}
,而单引号阻止插值。否则,该功能与默认分隔符的功能相同
在这种情况下
$filename =~ s[^.+/][]
与
$filename =~ s/^.+\///
但更具可读性
我倾向于选择管道字符|
,它看起来类似于通常的斜杠
$filename =~ s|^.+/||
但是选择取决于您但是在我给出的代码中既有
[
字符又有]
字符,因此它不仅仅是/
字符的替换。还有一些事情发生了。@CJ7请参见:“任何非空白分隔符都可以替换斜杠……如果模式是用括号括起来的引号分隔的,则替换项有自己的一对引号,这对引号可以是括号括起来的,也可以不是括号括起来的,例如,s(foo)(bar)
或s/bar/
”@CJ7您还可以使用:perl-MO=Deparse-e的[foo][bar]来证明这一点。
printss/foo/bar/代码>@CJ7:正如我试图解释的那样,如果选择的分隔符是四个开始括号字符中的一个,那么它的对将用作结束字符。替换s//
有两个参数,因此两者都必须被分隔,它显示为s(…)(…)
甚至s{…}
或s/../../[…]
%
不能使用,但在我给出的代码中既有[
字符,也有
字符,因此,它不仅仅是替换/
字符。还有其他一些事情在发生,[是]的自然“伙伴”,严格地说,我想你是对的,但除了用[和]替换一个“/”和另一个之外,实际上是一样的。你可以看到,以这种方式解释模式是多么容易——最后,另一个回答者的分数超过84k,并且说了同样的话——不太可能他错了,是吗?;-)相关:,