如何将包含单个正斜杠的网络文件路径作为参数传递给 tcl proc?

How to pass network filepath containing single forward slash as argument to tcl proc?

在 TCL 中,在将文件路径传递给过程时,单斜线被视为转义字符,因此它在所有地方都被删除。如果我稍后在过程中使用 {} 传递参数,我将无法将其转换回正常路径以进行任何替换操作。拆分函数未正确拆分花括号中的字符串。

尝试过的事情: 我正在尝试将包含单反斜杠和双反斜杠 (\) 的完整文件路径传递给 tcl 过程,以将路径的第一部分替换为不同的路径。我试过以下 1. 尝试按原样传递共享目录路径:所有反斜杠都消失了 2. 尝试在花括号中发送文件路径 结果:字符串按原样传递,但在过程中不可操作。如果我尝试拆分路径,则会产生奇怪的结果。在随机位置分裂,随机字符丢失。 3. 对于第二个用例,我也尝试了文件拆分,但它仍然给出与用例 2 相同的结果。 4. 还尝试了文件拆分功能,但它需要编写一个 for 循环,所以我将保留它作为解决方法,但是否有任何简单的程序。还是我做错了什么?

代码:

proc modpath {strPath} {
   puts "$strpath"     REM result /HuL0GBMV4087.example.comyourPLMB419CATEnvDevPerVisulisationV6R2017.txt
}

set fDir "\HuL0GBMV4087.example.com\yourPLM\B419\CATEnv\Dev\Per\Visulisation\V6R2017.txt"
modpath $fDir

如果我使用花括号

proc modpath {strPath} {
   puts "$strpath"     REM result "//HuL0GBMV4087.example.com/yourPLM/B419/CATEnv/Dev/Per/Visulisation/V6R2017.txt"
set PathInfo [split $strCurrentCockpitPath "B419"]
puts "PathInfo : $PathInfo"

REM result PathInfo : {"//HuL0G} MV 087.example.com/yourPLM/ {} {} {} /CATEnv/Dev/Per/Visulisation/V6R20 7.txt\"
}

set fDir {"\HuL0GBMV4087.example.com\yourPLM\B419\CATEnv\Dev\Per\Visulisation\V6R2017.txt"}
modpath $fDir

我希望如果我可以使用大括号传递参数,那么 split 函数应该可以正常工作以提供正常的字符串拆分输出。 我也尝试过许多 split 变体,但无法使其正常工作。

split 命令拆分字符,而不是字符串。 它按要求拆分 'B'、'4'、'1' 和 '9',return 值正确。

您可以使用 regexp 命令来获得您想要的内容:

# substitute \ for / if the path contains backslashes
set pathinfo [regexp -inline {^(.*)/B419/(.*)$} $strpath]

\ 字符在 Tcl 源代码中是特殊的,因为它用作转义序列的开始(例如,\n 是换行符的转义序列,\是反斜杠字符本身)。这意味着,如果您想要在源自脚本文本的值中使用这样的字符,则需要将其转义(与自身一起)或将整个字符串放在 { 大括号 } 中禁用其中的所有替换。 (双引号只影响空格的解释。)

set fDir "\\HuL0GBMV4087.example.com\yourPLM\B419\CATEnv\Dev\Per\Visulisation\V6R2017.txt"
set fDir {\HuL0GBMV4087.example.com\yourPLM\B419\CATEnv\Dev\Per\Visulisation\V6R2017.txt}

您不需要对其他地方的字符串进行特殊转义。除非明确告知,否则 Tcl 不会进行双重替换,因此不需要的替换总是表示您的代码中存在错误。


如果您要创建 URL,请使用另一个斜杠 /

要按字符串拆分,您也可以使用textutil::split::splitx命令。

例如:

package require textutil::split
textutil::split::splitx $fDir "B419"