gpt4 book ai didi

perl - 在 Perl 中如何组合重叠路径段以获得完整路径?

转载 作者:行者123 更新时间:2023-12-02 05:17:02 27 4
gpt4 key购买 nike

我真的不喜欢 Perl,但我必须将它用于我当前的任务。

这是我的问题...我有三个字符串,它们构成了完整目录路径的元素(windows,但也需要在 *nix 上工作)。例如……

$root = "c:\\checkout\\omega";
$client = "abc\\mainline";
$build = "omega\\abc\\mainline\\host\\make";

我想将它们结合起来形成一个完整的路径,例如

"c:\\checkout\\omega\\abc\\mainline\\host\\make" 

但是 $build 字符串与 $root 和/或 $client 字符串之间存在重叠。我如何将这些组合起来以获得完整路径并忽略重叠。 $client 在此示例中可能会被忽略,但在其他情况下,$build 可能$client 重叠,但 $root.

我可以想出很多可怕的困惑方法来实现它,但我假设(也许是错误的)有一种简单、干净甚至可能是优雅的方法来实现它,因为 Perl 主要是关于文本操作的。

可能是某种字符串或操作。我傻傻地试了...

($root . $client) | $build 

但它是位运算,结果是垃圾!

最佳答案

下面的正则表达式更适合消除重复的路径序列。

qr{ ( 
[\\/] # 1. starts with a path break
.+? # 2. whatever
)
\1 # whatever was captured in the previous group
# it forces us to backtrack on #2 until we have duplicates
# it will necessarily have a path break at the beginning
}x;

只要路径中没有重复的字母,Dave Webb 提供的正则表达式就可以工作。只需制作最后一个节点 'mmake',它就会中断。

我得到:

original c:\checkout\omega\abc\mainline\omega\abc\mainline\host\mmake
overlap m
new c:\checkout\omega\abc\mainline\omega\abc\mainline\host\make

您希望重复的是目录名,而不是字符。

还需要一个简单的替换。当您在正则表达式中看到 ^.*.*$ 时,可能是不需要的。在这一个中不再需要它。

事实上,所有这些都可以通过以下方式完成:

$path =~ s/([\\\/]+.+?)\1/$1/;

替换一些东西,它与那个东西重复。

File::Spec

顺便说一句,File::Spec 是公认的以独立于平台的方式连接目录的方式:

my $path = File::Spec->catfile( $root, $client, $build );
$path =~ s/([\\\/]+.+?)\1/$1/;

不过,我对 File::Spec 有点不满。我喜欢对目录使用/。并且 perl works 在 Windows 环境中使用 /。只要我留在 perl 的范围内,我就永远不必使用 escape 字符(在 C 语言家族中)来分隔路径。 File::Spec 强制反斜杠与 windows 平台一致。

但是,如果这正是您要寻找的,那可能是使用它的更多理由。

关于perl - 在 Perl 中如何组合重叠路径段以获得完整路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1426189/

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