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

Posted

技术标签:

【中文标题】从 Perl 中的字符串中删除文件扩展名和路径【英文标题】:Remove file extension and path from a string in Perl 【发布时间】:2011-04-09 17:34:49 【问题描述】:

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

例如:

/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 的新手。

【问题讨论】:

【参考方案1】:

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

要对文件扩展名进行启发式分析,我会选择像这样的正则表达式

(my $without_extension = $basename) =~ s/\.[^.]+$//;

【讨论】:

关于 basename 我刚刚读到:“提供此函数是为了与 Unix shell 命令 basename(1) 兼容。它并不总是像您期望的那样返回路径的文件名部分。要安全,如果您想要路径的文件名部分,请使用 fileparse()"。 是的,File::Basename 模块中有不止一个函数,它们都做不同的事情。选择一个做你想做的事。此外,File::Spec 中存在与splitpath 类似的功能【参考方案2】:

虽然其他人已经做出了回应,但在阅读了一些关于 rafl 的回答的 basename 之后:

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

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

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

【讨论】:

【参考方案3】:

假设路径分隔符为'/',则可以使用一对substitutions:

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

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

$name =~ s^.*/|\.[^.]+$g;

【讨论】:

简单有效。谢谢。 @Phalgun [^.] 是一个否定字符类,即它将匹配任何不是点的字符 (.)。 (注意. 在字符类中使用时会失去其特殊含义。)[^.]+ 将匹配一个或多个这样的字符。有关详细信息,请参阅perlre。

以上是关于从 Perl 中的字符串中删除文件扩展名和路径的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Bash 中的路径字符串中删除文件后缀和路径部分?

Perl Foreach 通过多维数组?

如何从 Perl 中的 2 个文件之一中删除公共行?

在 Perl 中,如何从文件中删除 ^M?

PHP 从路径中删除文件扩展名

如何使用 Perl 在文件中查找扩展的 ASCII 字符?