从 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 中的字符串中删除文件扩展名和路径的主要内容,如果未能解决你的问题,请参考以下文章