|.*/|| 是什么意思在 Perl 中做正则表达式替换?

What does |.*/|| do in Perl regex substitution?

我正在努力将 Perl cgi 脚本转换为 Python。

在脚本中,我遇到了下面这段我不理解的代码。

帮我解决一下。

my $p = [=10=];
$p =~ s|.*/||;

我了解到my $p = [=11=];将脚本文件的绝对路径+名称赋值给变量p

第二行将执行正则表达式替换,只给出没有路径的文件名。

但是我没看懂的是s之后的那些|.*/||

我搜索了很多资源,但不明白它的作用。

那些只给我脚本名称的东西实际上是做什么的?

鉴于特殊变量 [=10=] 不包含换行符 - s|.*/|| 正则表达式实际上删除了最后一个(包括最后一个)之前的 .*(所有内容)/ 从你的字符串。因此,您可以剪切路径并仅保留文件名(所有 最后一个 / 之后的所有内容)。

替换有不同的分隔符。它可以是 s/// 或其他。无论如何,您需要阅读有关 perl substitution.

的内容

仅供参考。 还要记住,.*? 意味着 non-greedy regexp。所以它将匹配第一个 /.

之前的任何内容

Perl 替换运算符如下所示:

s/PATTERN/STRING/

但它也是让您选择自己的定界符的 Perl 运算符之一。所以另一种写法是:

s|PATTERN|STRING|

这就是您在这里看到的版本。您的模式是 .*/ 并且替换字符串为空。所以你的替换意味着 "find as many (non-newline) characters as possible that are followed by a slash and replace them with nothing"。看看它上面一行中的赋值(它使用 [=14=] - 程序的路径)看起来我们有代码从路径的前面删除目录并只留下文件名。

也就是说,如果您以 /usr/local/bin/my_program 的程序名称开始,那么 $p 最终将只包含 my_program.

用 Perl 编写的更好方法是使用 File::Basename 模块。如果 Python 没有类似的东西,我会感到惊讶。

use File::Basename;

my $p = basename([=12=]);