在Perl中如何获取目录(文件路径)分隔符?

18

在Java中,我们可以使用

File.separator

来获取路径分隔符。

System.getProperty("path.separator");
在Perl中有类似的方法吗?我想做的就是找到一个目录,它是直接的子目录。 假设我有两个参数$a和$b;我将根据路径分隔符对第一个参数进行拆分,然后将其再次组合,除了最后一个片段,再与第二个参数进行比较。
问题是我的代码必须是通用的,为此我需要知道系统相关的路径分隔符是什么?

1
你看过其他的问题吗?http://stackoverflow.com/questions/2859015/why-dont-my-perl-regexes-correctly-extract-a-filename-from-a-path,https://dev59.com/YErSa4cB1Zd3GeqPXZGh - Zaid
6
为了搜索引擎的好处:这个问题和答案实际上涉及目录分隔符(通常是斜杠或反斜杠)。路径分隔符是另一件事情(通常是冒号或分号),具有不同的目的,并且可以通过 use Config; $Config{path_sep} 返回。请注意,以下为翻译内容,不包括任何解释。 - daxim
@daxim - 我编辑了标题,希望现在不那么模糊了。 - DVK
在Perl和Java中,正斜杠“/”在Windows上的工作方式与它们在linux / unix / mac上的工作方式相同。对于许多源自类Unix的命令行工具(如Ghostscript和TeX),情况也是如此。因此,大多数时候您不需要知道路径分隔符。 - MJ Walsh
4个回答

26

您不应手动组合文件路径 - 相反地,应使用File::Spec模块:

($volume, $directories,$file) = File::Spec->splitpath( $path );
@dirs = File::Spec->splitdir( $directories );
$path = File::Spec->catdir( @directories );
$path = File::Spec->catfile( @directories, $filename );

不要忘记splitdir。更优雅的处理路径的方式是使用来自CPAN的Path::Class。 - Schwern
@singingfish - 表面上看起来相当容易,但说实话,File::Spec 在我看来已经足够简单,不需要更简单的替代方案,至少对于我所需的任何任务来说是这样。但我喜欢 Path::Class APIss... 简洁易读。 - DVK
3
但这并没有回答问题:如何使用Perl获取本机路径分隔符?而且看起来File::Spec应该有一个方法来处理它,因为它肯定知道,但实际上并没有。 - Francisco Zarabozo
确实,@FranciscoZarabozo,Perl没有路径分隔符的特殊变量。不确定为什么没有,也不确定为什么File::Spec没有暴露它... Perl之谜。请注意,PythonJava都有。 - Trutane
1
@Trutane - 可能是因为 Perl 在创建时基于 Unix,而此时不同的路径分隔符并不是一个概念。Python 和 Java 都诞生于 Windows+Unix 的世界。这只是我的猜测,我没有任何依据来支持它。 - DVK
显示剩余3条评论

12
如果您真的想要获取分隔符(仅使用Perl核心模块):
my $sep = File::Spec->catfile('', '');

这将两个空文件名与当前系统的分隔符连接起来,只保留分隔符。


9
你可以使用File :: Util中的SL常量,详见此处

0

在使用File::Spec之前,我使用的是这个方法。它至今仍然可用,并且在我所遇到的每个类Unix和Windows平台上都可以运行,即使是非常古老的Perl版本。

基本上,这个想法是询问Perl使用哪个字符作为目录分隔符:

$dirSep = ( $ENV{"PATH"} =~ m/;[a-z]:\\/i ) ? '\\' : '/' ; 
print $dirSep;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接