由于一些混乱的遗留代码,
我有
$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
答案 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);