我在尝试阅读\\server\directory
等列表的成员时遇到问题
当我尝试使用lindex
命令获取此变量时,会出现问题,该命令继续进行TCL替换,结果是:
\serverdirectory
然后,我认为我需要使用regsub
命令来避免反斜杠替换,但是我没有得到正确的结果。
我想要的一个例子应该是:
set mistring "\\server\directory"
regsub [appropriate regular expresion here]
puts "mistring: '$mistring'" ==> "mistring: '\\server\directory'"
我已经检查了一些这方面的帖子,并保持\\
没问题,但是我仍然遇到问题,试图始终保持一个\
,然后是可能来到这里的任何其他角色。< / p>
更新:具体示例。我实际上要保留的是列表中元素的初始格式。该列表由外部应用程序接收。原始代码是这样的:
set mytable $__outer_list_received
puts "Table: '$mytable'"
for { set i 0 } { $i < [llength $mitabla] } { incr i } {
set row [lindex $mytable $i]
puts "Row: '$row'"
set elements [lindex $row 0]
puts "Elements: '$elements'"
}
此输出,在这种情况下是:
Table: '{{
address \\server\directory
filename foo.bar
}}'
Row: '{
address \\server\directory
filename foo.bar
}'
Elements: '
address \\server\directory
filename foo.bar
'
因此,我尝试获取地址的值(在此特定情况下为\\server\directory
),以便将其写入配置文件中,保留原始格式和数据。
我希望这能澄清问题。
答案 0 :(得分:1)
如果您不想要替换,请将有问题的字符串放在花括号内。
% puts "\\server\directory"
\serverdirectory
并不是你想要的。但
% puts {\\server\directory}
\\server\directory
根据需要。
答案 1 :(得分:0)
由于这在Windows上基本上是一个问题(并且Tcl总是将双引号中的反斜杠视为执行转义替换的指令),您应该考虑采用不同的方法(否则您会遇到反斜杠消失的问题)你可以应用代码来“修复”它们。幸运的是,你有两个替代方案。第一种是将字符串放在{
大括号}
中以禁用替换,就像C#逐字字符串文字(但使用@"
而不是"
)。第二种可能更合适:
set mistring [file nativename "//server/directory"]
确保在Windows上使用平台本机目录分隔符(现在在其他平台上什么都不做;当支持旧的MacOS9时,它更加神奇)。通常情况下,如果要向用户显示完整路径名(通常是一个坏主意,GUI方式),或者如果您将名称传递给某些不喜欢正斜杠的API(特别是当作为通过exec
对程序的参数,但还有其他地方泄漏细节,例如,如果您使用的是dde,tcom或twapi包。)
答案 2 :(得分:0)
第三个,虽然丑陋,但选择是加倍斜线。 \\而不是\,和\而不是\,同时使用双引号。当替换发生时,它应该给你你想要的。当然,如果你再次进行替换,这将无济于事。