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

时间:2019-11-09 08:03:08

标签: tcl parameter-passing filepath

在TCL中,在将文件路径传递到过程时,单斜杠被视为转义符,因此在所有位置都将其删除。如果我稍后在过程中使用{}传递参数,则无法将其转换回正常路径以进行任何替换操作。分割功能无法正确将花括号中的字符串分割开。

事物尝试: 我正在尝试将包含单和双反字斜杠(\)的完整文件路径传递给tcl过程,以将路径的第一部分替换为其他路径。我尝试了以下 1.尝试通过共享目录路径,因为结果是:所有反斜杠都消失了 2.尝试以大括号形式发送文件路径结果:字符串按原样传递,但无法在proc中操作。如果我尝试分割路径,那么结果会很奇怪。随机位置的分割和随机字符丢失。 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进行多种变体,但无法使其正常工作。

3 个答案:

答案 0 :(得分:0)

split命令会分割字符,而不是字符串。 按要求将其拆分为“ B”,“ 4”,“ 1”和“ 9”,并且返回值正确。

您可以使用regexp命令来获取所需的内容:

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

答案 1 :(得分:0)

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

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

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


如果要创建URL,请使用另一个斜杠set fDir {\\HuL0GBMV4087.example.com\yourPLM\B419\CATEnv\Dev\Per\Visulisation\V6R2017.txt}

答案 2 :(得分:0)

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

例如:

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