TCL字符串映射(到\(

时间:2018-03-13 06:22:37

标签: string replace tcl

如何做到这一点

puts [string map { ( ) "\(" "\)"} (3.8.001)] 

o \ p我得到$ tclsh main.tcl

(3.8.001)

我期待

\(3.8.001\)

帮我做这个

2 个答案:

答案 0 :(得分:4)

您应该使用string map,如下所示,

puts [string map { ( "\\(" ) "\\)"} (3.8.001)]

反斜杠必须使用两次,才能在Tcl中的双引号内使用单个反斜杠。

答案 1 :(得分:1)

每当我对如何编写带有反斜杠的复杂string map感到困惑时,我尝试使用list构建映射列表。然后我可能会使用它生成的文字,而不是让我的脚本包含实际的list命令调用,但这只是我自己的优化。 (并且值非常低;如果list的所有参数都是文字,字节码编译器会为我做。)在特别棘手的情况下,我将使用lappend分阶段构建它,但那只是发生的事情才是真正令人头疼的事情!

此外,映射应该是“replaceA withA replaceB withB ...”;您将)"\("置于错误的顺序中,结果根本不会发生。

set mapping [list "(" "\\(" ")" "\\)"]
# puts "mapping is “$mapping”";  # Yay for unicode quote characters!
puts [string map $mapping (3.8.001)] 

你正在寻找的顺序是这样,有更多的括号和更少的双引号,但我鼓励你学习如何为自己解决这个问题......

puts [string map {( {\(} ) {\)}} "(3.8.001)"]