如何在Perl中更正特定于操作系统的文件路径?

时间:2010-10-12 06:42:42

标签: perl filenames portability

由于一些混乱的遗留代码,

我有

$path = [OS specific base DIR name][hardcoded Linux file path]

所以在Linux上,它就像是

$path = /common/path/to/dir/pathtofile/name.extension

但在Windows上它变成了这个

$path = C:\path\to\dir\pathtofile/name.extension

某些代码在Windows上失败,因为它在\时期望/

是否有可以帮助我的Perl功能?

这样的东西
print "$path\n";
$path = <some function> $path;
print "$path\n";

C:\path\to\dir\pathtofile/name.extension
C:\path\to\dir\pathtofile\name.extension

3 个答案:

答案 0 :(得分:6)

File::Spec模块系列正是出于这个原因。您可能需要考虑使用它而不是硬编码unix路径。

use File::Spec::Functions 'catfile';

my $path = catfile($os_specific_base_dir, 'pathtofile', 'name.extension');

如果你真的需要在某处硬编码unix路径,这似乎不是一个好主意,你应该使用File::Spec::Unix将路径分成它的组件,然后使用{{1}变种原生于你的目标系统构建将组件重新组合在一起。

答案 1 :(得分:1)

你看过File::Spec核心模块 - 以及相关模块吗?

答案 2 :(得分:0)

听起来你正在把整个$ path从其他地方传递给你作为一个整体,而不是分开处理这些作品的奢侈。在这种情况下,如果我们在Windows下运行,我没有看到比用反斜杠替换所有斜杠的丑陋解决方案更好的答案。

以下内容可以满足您的需求:

if ($^O =~ /^MSWin/) {
    $path =~ s{/}{\\}g;
}

编辑:第二个想法 - 看了一下File :: Spec,看起来你想要canonpath函数:

use File::Spec;
# ...
$path = File::Spec->canonpath($path);