【发布时间】:2010-11-28 09:52:52
【问题描述】:
我真的不喜欢 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 may 与 $client 重叠而不是 $root。
我可以想到很多可怕的混乱方式来实现它,但我假设(也许是错误的)有一种简单、干净甚至优雅的方式来实现它,因为 Perl 主要是关于文本操作。
可能是某种字符串或运算。我愚蠢地尝试了......
($root . $client) | $build
但它是按位运算,结果是垃圾!
【问题讨论】:
-
文字斜线不会造成问题吗?并不是说您可以在 Windows 上使用“/”作为目录分隔符: $root = "c:/checkout/omega"; $client = "abc/主线"; $build = "omega/abc/mainline/host/make";
-
目前双引号中的\是转义字符。您需要转义它们 \\ 或改用单引号(或 q{})。就像 Pod 说的,你可能会发现在 Windows 上使用 / 可以正常工作。
-
这个问题不清楚,但如果你能不那么模棱两可的话,很可能会有一个简单的答案。你到底想做什么?在您的示例中,您没有组合所有三个路径元素。你能解释一下什么时候应该组合元素,什么时候不应该组合?
-
您可能想要使用 File::Spec,但您能进一步解释一下吗?我认为你的意思是你需要删除路径组件直到并包括 $build 中的 $client (给你留下类似 'host\make' 的东西,然后将剩下的部分与 $root 和 $client 结合起来得到类似 '$ root\$client\$remainder'。对吗?
-
噢!是的,'\\' 表示斜线!