我需要Perl中类似于Python的os.path.normpath()函数:
通过折叠冗余分隔符和上级引用来规范化路径名,以便A//B、A/B/、A/./B和A/foo/../B都变成A/B。这种字符串操作可能会改变包含符号链接的路径的含义。例如,我想将'/a/../b/./c//d'转换为/b/c/d。
我正在处理的路径不代表本地文件树中的实际目录。没有涉及符号链接。因此,普通的字符串操作就可以胜任。
我尝试了Cwd::abs_path和File::Spec,但它们不能满足我的要求。
通过折叠冗余分隔符和上级引用来规范化路径名,以便A//B、A/B/、A/./B和A/foo/../B都变成A/B。这种字符串操作可能会改变包含符号链接的路径的含义。例如,我想将'/a/../b/./c//d'转换为/b/c/d。
我正在处理的路径不代表本地文件树中的实际目录。没有涉及符号链接。因此,普通的字符串操作就可以胜任。
我尝试了Cwd::abs_path和File::Spec,但它们不能满足我的要求。
my $path = '/a/../b/./c//d';
File::Spec->canonpath($path);
File::Spec->rel2abs($path, '/');
# Both return '/a/../b/c/d'.
# They don't remove '..' because it might change
# the meaning of the path in case of symlinks.
Cwd::abs_path($path);
# Returns undef.
# This checks for the path in the filesystem, which I don't want.
Cwd::fast_abs_path($path);
# Gives an error: No such file or directory
可能相关的链接:
- 规范化目录路径 - perlmonks:人们讨论了几种方法。