从Perl中的字符串中删除文件扩展名和路径

Chr*_*ris 29 regex perl file-extension filepath

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

例如:

/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" 
Run Code Online (Sandbox Code Playgroud)

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

很抱歉这样的新手问题,但我是perl的新手.

raf*_*afl 38

为了便于获取给定完整路径的文件的基本名称,我建议使用该File::Basename模块,它是核心的一部分.

要对文件扩展名进行启发式检测,我会选择正则表达式

(my $without_extension = $basename) =~ s/\.[^.]+$//;
Run Code Online (Sandbox Code Playgroud)

  • 是的,`File :: Basename`模块中有多个函数,它们都做不同的事情.选择一个做你想要的.另外,类似的功能在`File :: Spec`中作为`splitpath`存在 (4认同)
  • 关于基名,我刚刚读到:“提供此功能是为了与Unix shell命令basename(1)兼容。它并不总是返回您所期望的路径的文件名部分。为了安全起见,如果需要文件名路径的一部分使用fileparse()”。 (2认同)

Chr*_*ris 18

虽然其他人已经做出回应,但在阅读了一下基本名称后,根据rafl的回答:

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

似乎在一行中解决问题.

有没有与此相关的问题,与其他解决方案相反?


Eug*_*ash 16

你可以用简单的替换来做到这一点:

$name =~ s{^.*/}{};     # remove the leading path  
$name =~ s{\.[^.]+$}{}; # remove the extension
Run Code Online (Sandbox Code Playgroud)

此示例假定这'/'是路径分隔符.

  • @Phalgun`[^。]`是*否定的字符类*,即它将匹配非点号(`.`)的任何字符。(请注意,当在字符类中使用时,。会失去其特殊的含义。)`[^。] +`将匹配*一个或多个*这样的字符。有关更多详细信息,请参见[perlre](https://perldoc.perl.org/perlre.html)。 (2认同)