我知道可以使用正则表达式,但我找不到正确的表达式。还有任何可用的内置函数吗?
答案 0 :(得分:4)
我建议改用File::Spec核心模块。如果您只是需要检查给出的是否是绝对路径,请使用file_name_is_absolute()
;如果你需要将相对路径转换为绝对路径,使用rel2abs()
,你会看到模式。 )它更容易,更易读。
答案 1 :(得分:2)
假设:
bmake: stopped in /bb/cc/xx/yy/zz/aa
这个正则表达式将拉出路径名:
m%\s(/.*)%
它会查找一个空格字符,然后是斜杠,后跟任何内容。如果路径名中没有空格,则可以使用限制性更强的:
m%\s(/\S*)%
如果您确定您的名称总是有一个或多个路径组件,则可以添加更多限制:
m%\s(/\S+/\S*)%
所以它继续下去。您对路径中的有效内容了解得越多,仅匹配文件名的可能性就越大。但请注意,Unix上的文件名可以包含除/
之外的任何字符(因为它是路径名称各部分之间的分隔符)和\0
(NUL字节)。其他所有内容 - 换行符,标签,控件等 - 都是公平的游戏,可能是文件名的一部分。幸运的是,它们中的大多数通常不存在于文件名中。
请注意,相对路径名比绝对路径名更难。
答案 2 :(得分:1)
/(.+/)*.*
使用此模式。一开始是斜线,然后是目录(可能不是任何),最后是文件名或目录名(这可能不是太多)。实际上这将匹配以斜杠开头的所有内容但是没关系,因为unix中的路径可以包含除\0
之外的所有内容。