Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex perl中的s[][]表示法_Regex_Perl - Fatal编程技术网

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]来证明这一点。
prints
s/foo/bar/@CJ7:正如我试图解释的那样,如果选择的分隔符是四个开始括号字符中的一个,那么它的对将用作结束字符。替换
s//
有两个参数,因此两者都必须被分隔,它显示为
s(…)(…)
甚至
s{…}
s/../../[…]
%
不能使用,但在我给出的代码中既有
[
字符,也有
字符,因此,它不仅仅是替换
/
字符。还有其他一些事情在发生,[是]的自然“伙伴”,严格地说,我想你是对的,但除了用[和]替换一个“/”和另一个之外,实际上是一样的。你可以看到,以这种方式解释模式是多么容易——最后,另一个回答者的分数超过84k,并且说了同样的话——不太可能他错了,是吗?;-)相关:,