这些片段似乎与我相同:
$ perl -E '
my $var="/usr/local/bin/gcc";
$var =~ s/([^\/]*)$/$1/;
print "$var\n";'
/usr/local/bin/gcc
$ perl -E '
my $var="/usr/local/bin/gcc";
$var =~ /([^\/]*)$/;
print "$1\n";'
gcc
然而,代码段1中的替换不起作用。它打印/usr/local/bin/gcc
而不是gcc
,而$1
正确,因为第二个代码段证明了。
这有什么问题?
答案 0 :(得分:2)
您对等效的期望有些不对。与第二个例子相当的是:
$ perl -E '
my $var="/usr/local/bin/gcc";
$var =~ s/.*?([^\/]*)$/$1/;
print "$var\n";'
gcc
您正在做的只是捕获组中的模式,并用自己替换这样捕获的组。如果你尝试用什么来代替比赛,那就显而易见了:
$ perl -E '
my $var="/usr/local/bin/gcc";
$var =~ s/([^\/]*)$//;
print "$var\n";'
/usr/local/bin/
答案 1 :(得分:1)
您的替换是在字符串末尾找到与[^\/]*
匹配的文本,并将其替换为匹配的文本(即它是一个标识操作)。
第二个例子只输出匹配的文本,忽略字符串开头不匹配的文本。
如果您希望第一个示例执行与第二个示例相同的操作,则应尝试将模式修改为:s/^.*?([^\/]*)$/$1/
答案 2 :(得分:0)
为您的特殊应用提供更便携的解决方案。使用核心模块来操作文件路径总是一个好主意。所以我建议如下
$ perl -MFile::Basename -E '
my $var="/usr/local/bin/gcc";
print scalar fileparse($var), "\n";'
gcc