在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进行多种变体,但无法使其正常工作。
答案 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"