我希望catch "
转换为newcatch {
。我尝试了以下方法:
% string map { {catch "} {newcatch \{} } {catch "}
newcatch \{
我想在输出中newcatch {
。请建议我如何做到这一点。如果您找到其他方法,请考虑如何以最小的修改采取上述方法。另外,为什么不必转义"
(如果我转义它在提供的字符串中不匹配。
答案 0 :(得分:2)
puts [ string map { {catch "} newcatch\ \{ } {catch "}]
除了在匹配字符串中转义文字括号外,我也逃脱了空格字符。即newcatch\ \{
代码可以写成
puts [ string map { catch\ \" newcatch\ \{ } {catch "}]
更新 这不是必要的。这是由于您想要的输出。
string map
的语法如下,
string map ?-nocase? mapping string
暂时忘记-nocase
标志。为简单起见,可以写成,
string map <key1 value1 key2 value2 ... > <target-string>
键值对集可以在双引号的帮助下编写,也可以用空格分隔。不同之处在于,使用大括号,替换根本不会发生,并且将使用字面值来处理。
即。它可以是"foo bar hello world"
或{foo bar hello world}
您的主要要求是映射文字大括号。请考虑以下示例
puts "{"
puts {\{}
虽然前者将精确地生成文字支撑,但后来会打印括号和反斜杠。即\{
这是因为,当在括号内进行转义时,它将按字面意思进行。
同样的逻辑也适用于string map
命令。由于您需要与{
匹配。
更新2:
先试试这个。
puts {{}}
将输出为{}
。 puts {{}
失败的原因是因为它不平衡。 Tcl
会认为你已经在{
内打开了一个左括号{}
,并且因为在括号之间使用了它,所以还需要一个左括号。如前所述,puts "{"
有效,因为它不是用大括号来解释,而是用双引号来解释。
回到我们的故事。为了使Tcl将左括号解释为文字括号,我们使用反斜杠作为\{
进行转义。
现在,还有一个规则开始了。使用大括号,替换不会发生,它将被视为文字值,我之前已经引用过,{{1}按字面意思打印为\{
。 :)
更新3:
我们正在谈论这个话题。不是吗?无论如何,让我试试。
首先,为了逃避左支撑,我们在前面加上反斜杠。这可以防止tcl抛出\{
消息。
正如我们所知,无论是在牙箍中存在什么,都可以如此处理/印刷。
我们有什么?只有1个}}。这就是它按原样打印的原因。
坦率地说,如果Mr.Donal Fellows看到这篇文章,他可以作一个快速的讲座作为答案。:)答案 1 :(得分:0)
用双引号读取映射器可能更容易。
catch.tcl
#!/usr/bin/tclsh
set mapper { "catch \"" "newcatch \{" }
set mapped [string map $mapper {catch "}]
puts $mapped
输出:
./catch.tcl
newcatch {