2

我在尝试读取列表的成员时\\server\directory 遇到问题当我尝试使用lindex命令获取此变量时出现问题,该命令通过 TCL 替换进行,因此结果是:

\serverdirectory

然后,我想我需要使用regsub命令来避免反斜杠替换,但我没有得到正确的过程。

我想要的一个例子应该是:

set mistring "\\server\directory"
regsub [appropriate regular expresion here]
puts "mistring: '$mistring'"  ==> "mistring: '\\server\directory'"

我已经检查了一些关于这个的帖子,并且保持它\\是好的,但是当我试图始终保持一个单一\的,然后是任何其他可能出现在这里的角色时,我仍然遇到问题。

更新:具体示例。我实际上想要保留的是列表中元素的初始格式。该列表由外部应用程序接收。原始代码是这样的:

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),以便将其写入配置文件,保持原始格式和数据。我希望这能澄清问题。

4

3 回答 3

2

如果您不想替换,请将有问题的字符串放在大括号内。

% puts "\\server\directory"
\serverdirectory

这不是你想要的。但

% puts {\\server\directory}
\\server\directory

根据您的需要。

于 2013-10-21T13:42:55.287 回答
0

A third, although ugly, option is to double the slashes. \\ instead of \, and \ instead of \, while using double quotes. When the substitution occurs it should give you what you want. Of course, this will not help much if you do the substitution a second time.

于 2013-10-28T01:02:08.930 回答
0

由于这在 Windows 上基本上是一个问题(并且 Tcl 总是将双引号中的反斜杠视为执行转义替换的指令),您应该考虑一种不同的方法(否则您会遇到反斜杠在您可以应用时消失的问题代码来“修复”它们)。幸运的是,您有两种选择。第一种是将字符串放在{大括号}中以禁用替换,就像 C# 逐字字符串文字(但它使用@"this"代替)。第二种可能更合适:

set mistring [file nativename "//server/directory"]

这确保了在 Windows 上使用平台本机目录分隔符(现在在其他平台上什么都不做;当支持旧的 MacOS9 时,它更加神奇)。通常,如果您向用户显示完整的路径名(通常是一个坏主意,GUI 方面),或者如果您将名称传递给一些不喜欢正斜杠的 API(尤其是作为程序的参数 via,exec但还有其他地方会泄露细节,例如,如果您使用的是 dde、tcom 或 twapi 包)。

于 2013-10-22T08:39:02.150 回答