36

我想获得一个没有路径的文件名(如果它是字符串的一部分)以及扩展名。

例如:

/path/to/file/fileName.txt     # results in "fileName"
fileName.txt                   # results in "fileName"
/path/to/file/file.with.periods.txt    # results in "file.with.periods" 

所以基本上,我想删除之前的任何内容,包括最后一个“/”(如果存在)以及最后一个“。” 以及它之后的任何元字符。

对于这样一个新手问题,我很抱歉,但我是 perl 的新手。

4

3 回答 3

42

为了在给定完整路径的情况下可移植地获取文件的基本名称,我建议使用该File::Basename模块,它是核心的一部分。

要对文件扩展名进行启发式分析,我会使用正则表达式,例如

(my $without_extension = $basename) =~ s/\.[^.]+$//;
于 2010-09-08T12:54:11.767 回答
23

尽管其他人已经做出了回应,但在阅读了 rafl 的回答中关于 basename 的一些内容后:

($file,$dir,$ext) = fileparse($fullname, qr/\.[^.]*/);
# dir="/usr/local/src/" file="perl-5.6.1.tar" ext=".gz"

似乎可以一口气解决问题。

与其他解决方案相反,是否存在与此相关的问题?

于 2010-09-08T13:03:10.687 回答
16

假设路径分隔符是'/',您可以使用一对替换来做到这一点:

$name =~ s{^.*/}{};     # remove the leading path  
$name =~ s{\.[^.]+$}{}; # remove the extension

您也可以将其写为单个替换:

$name =~ s{^.*/|\.[^.]+$}{}g;
于 2010-09-08T12:54:50.520 回答