gpt4 book ai didi

ruby - 相对于绝对路径转换(对于 perforce 仓库路径),我可以更好地做到这一点吗?

转载 作者:数据小太阳 更新时间:2023-10-29 07:20:21 26 4
gpt4 key购买 nike

我需要“盲目地”(即无法访问文件系统,在本例中是源代码控制服务器)将一些相对路径转换为绝对路径。所以我在玩点和指数。对于那些好奇的人,我有一个由其他人的工具生成的日志文件,有时会输出相对路径,出于性能原因,我不想访问路径所在的源代码控制服务器来检查它们是否有效等等轻松地将它们转换为它们的绝对路径等价物。

我经历了很多(可能是愚蠢的)迭代试图让它工作 - 主要是迭代文件夹数组并尝试 delete_at(index) 和 delete_at(index-1) 但我的索引当我从自己下面删除数组的元素时,它一直在递增,这对于有多个点的情况不起作用。欢迎任何关于改进它的一般建议或特别是缺乏非连续点点支持的建议。

目前这正在使用我有限的示例,但我认为它可以改进。它无法处理不连续的“..”目录,而且我可能正在做很多我可能不需要做的浪费(且容易出错)的事情,因为我有点 hack。

我找到了很多使用其他语言转换其他类型相对路径的例子,但似乎没有一个适合我的情况。

这些是我需要转换的示例路径,来自:

//depot/foo/../bar/single.c

//depot/foo/docs/../../other/double.c

//depot/foo/usr/bin/../../../else/more/triple.c

到:

//depot/bar/single.c

//depot/other/double.c

//depot/else/more/triple.c

还有我的脚本:

begin

paths = File.open(ARGV[0]).readlines

puts(paths)

new_paths = Array.new

paths.each { |path|
folders = path.split('/')
if ( folders.include?('..') )
num_dotdots = 0
first_dotdot = folders.index('..')
last_dotdot = folders.rindex('..')
folders.each { |item|
if ( item == '..' )
num_dotdots += 1
end
}
if ( first_dotdot and ( num_dotdots > 0 ) ) # this might be redundant?
folders.slice!(first_dotdot - num_dotdots..last_dotdot) # dependent on consecutive dotdots only
end
end

folders.map! { |elem|
if ( elem !~ /\n/ )
elem = elem + '/'
else
elem = elem
end
}
new_paths << folders.to_s

}

puts(new_paths)


end

最佳答案

让我们不要重新发明轮子... File.expand_path 为您完成:

[
'//depot/foo/../bar/single.c',
'//depot/foo/docs/../../other/double.c',
'//depot/foo/usr/bin/../../../else/more/triple.c'
].map {|p| File.expand_path(p) }
# ==> ["//depot/bar/single.c", "//depot/other/double.c", "//depot/else/more/triple.c"]

关于ruby - 相对于绝对路径转换(对于 perforce 仓库路径),我可以更好地做到这一点吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2836825/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com