如何做到这一点
puts [string map { ( ) "\(" "\)"} (3.8.001)]
o \ p我得到$ tclsh main.tcl
(3.8.001)
我期待
\(3.8.001\)
帮我做这个
答案 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)"]