gpt4 book ai didi

string - TCL:如何转义使用大括号 '{' 引用的字符串中的单个大括号 '{...}' ?

转载 作者:行者123 更新时间:2023-12-02 00:57:57 26 4
gpt4 key购买 nike

我尝试使用大括号来定义字符串 { } 而不是双引号 "",这样我就不必转义几个字符(例如 $[])。

但是,当我的字符串需要在其中包含单个 { 时,我遇到了一些问题。
我知道我可以通过简单地使用双引号字符串并转义 { 来实现此目的,但是如何使用“大括号字符串”来实现这一点?

例如。我想将以下字符串“proc foo { } {放入到标准输出。

puts "proc foo\{\}\{" 给出了所需的输出:'proc foo { } {'

但是, puts { proc foo\{\}\{ } 通过逐字打印反斜杠给我: 'proc foo\{\}\{'。

如果我跳过反斜杠,puts { proc foo { } {,它会提示缺少大括号。

此外,如果所需的字符串中有匹配的右大括号,则它可以正常工作。
puts { proc foo { } { } } 给了我预期的结果:'proc foo { } { }'

转义“大括号字符串”中单个不匹配的大括号的正确方法是什么?

最佳答案

抱歉,大括号字符串的服务条款要求您为每个左大括号提供匹配的右大括号。拥有不匹配大括号的唯一方法是用反斜杠引用/转义它们,但不会执行反斜杠替换,因此反斜杠与单独的大括号一起进入字符串。

这并不意味着您无法构造您想要的字符串,例如这样:

set foo { proc foo { } }
# -> proc foo { }
append foo "{ "
# -> proc foo { } {

(顺便说一句,您不需要在双引号字符串中使用反斜杠,"proc foo { } { " 就可以了。)

但是,您正在构建的字符串似乎暗示您正在脚本内构建过程定义,并且以错误的方式进行处理。而不是像这样组装定义:

set foo { proc foo { } }
# -> proc foo { }
append foo "{ "
# -> proc foo { } {
append foo { puts foo }
# -> proc foo { } { puts foo
append foo " }"
# -> proc foo { } { puts foo }

你应该这样做:

set name foo
set args {}
set body {puts foo}
proc $name $args $body

直接定义过程。如果您需要将其作为字符串,请像这样包装它:

set foo [list proc $name $args $body]
# -> proc foo {} {puts foo}

是的,我正在使用list来构造一个字符串。这是因为将 proc $name $args $body 括在双引号中会导致命令的列表结构丢失。我创建一个列表,然后使用该列表的字符串表示形式作为字符串。

如果您这样做,您就是在使用 Tcl 解释规则并利用它们,而不是违背它们。这意味着更少的工作和更少的错误。

文档:append , list , proc , set

关于string - TCL:如何转义使用大括号 '{' 引用的字符串中的单个大括号 '{...}' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31526686/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com