是否有一个可以折叠文件系统路径(如a/b/)的Perl模块。。还是a//b?

是否有一个可以折叠文件系统路径(如a/b/)的Perl模块。。还是a//b?,perl,filesystems,Perl,Filesystems,我正在编写一个程序,在这个程序中,我必须删除路径中的冗余,例如 a/b/.. -> a a//b -> a/b a/./b -> a/b 有没有任何现有的模块可以做到这一点 更新:此规范化/规范化由描述。我只需要路径段规范化部分 当然,这很容易实现。我仍然想知道它是否已经打包到某个模块中。标准中没有指定URL层次结构中元素的表单路径和含义或关系。根据服务器的不同,可能根本就没有层次结构-由/拆分的元素可能被视为位置元素,或者顺序可能根本没有意义。因此,没有特定的模块来处

我正在编写一个程序,在这个程序中,我必须删除路径中的冗余,例如

a/b/.. -> a
a//b   -> a/b
a/./b  -> a/b
有没有任何现有的模块可以做到这一点

更新:此规范化/规范化由描述。我只需要路径段规范化部分


当然,这很容易实现。我仍然想知道它是否已经打包到某个模块中。

标准中没有指定URL层次结构中元素的表单路径和含义或关系。根据服务器的不同,可能根本就没有层次结构-由
/
拆分的元素可能被视为位置元素,或者顺序可能根本没有意义。因此,没有特定的模块来处理URL的任务

然而,如果您完全确定目标服务器的工作方式,您可以简单地适应您的需要:从URL中提取路径(例如,使用),将其作为文件路径进行处理,然后将其放回原处

考虑到您的评论,即您将在文件系统上使用常规文件名,您甚至不需要从path提取任何内容-
file::Spec
足以满足您的所有需要


如果您希望解决
文件::Spec
(按设计)不解析
,请使用
拆分路径
从中提取名称的目录部分,
拆分目录
将其拆分为目录,然后仅迭代该数组,
每次遇到
时拼接两个元素。
。使用
catdir
catfile
将结果打包回来。

通常URL与文件系统URL不遵循相同的原则。例如,有许多web服务使用类似路径的语法来传递参数。示例:在URL
http://.../path/to/script/controller/action
实际执行的脚本可能是
script
,它使用
controller/action
来确定它应该做什么。@MoritzBunkus没错。我的程序用于确定文件系统URL是否唯一(忽略链接)。我不确定“URL”是否是这里的正确单词。请注意,
a/b/。
不一定是
a
,这取决于软链接
可以将您带到
a
以外的其他地方。@mirod:是的。我忽略了符号链接。File::Spec::canonpath()似乎可以做到这一点,但它不会折叠
s(由于可能存在符号链接)。我无法使用他们建议的Cwd::realpath(),因为路径可能不存在。@Andreas,您可以轻松实现
在模块中使用函数进行折叠,请参阅更新。