|.*/|| 是什么意思在 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=]);
我正在努力将 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=]);