如何在 Tcl 中粘贴文字
How to paste literal words in Tcl
是否有任何语法技巧/功能可以让我在 TCL 中粘贴两个 文字 单词,例如将大括号 ({..}
) 单词和双引号 "..."
) 单词连接成一个单词?
我不是在问 set a {foo}; set b "bar\nquux"; set c $a$b
或 append a $b
-- 我知道他们;但是关于没有中间变量或命令的东西。类似于 {*}word
(将单词转换为列表)。
我猜答案是"no way",但我对Tcl的浅薄知识不允许我得出这样的结论。
如果你的单词是一个有效的列表,你可以这样做:
set orig {abc def}
set new [join $orig {}]
如果您使用的是最新的 Tcl 版本(8.6.2 或更高版本),您可以使用
set c [string cat {foo} "bar\nquux"]
对于旧版本,您可以求助于
set c [format %s%s {foo} "bar\nquux"]
没有命令就无法完成您的要求,因为大括号的语法不允许前后有任何内容,一旦您有几个单词,您需要使用命令将它们连接起来 (因为从 Tcl 语言核心的角度来看,这就是命令所做的;采用一些值并产生值结果)。并不是说在字符串中间有大括号是语法错误——它不是——但它确实阻止了它们成为引号字符。要明确:
puts a{b}
打印 a{b}
因为 {
在那种情况下 不特殊 而是成为值的一部分。
puts {a}b
是语法错误。 (唯一的 例外是 {*}
,它以 {expand}
开头,但 waaaay 太啰嗦了。)
有效的方法:
- 使用
string cat
.
- 使用连接程序(例如,
proc strcat {a b} {return $a$b}
- 将两个值都放在大括号内,这样它就是一个组合文字。当然,这只有在两个部分都是文字的情况下才有效。
- 将大括号部分转换为非大括号(和非双引号)形式。这是 总是 可能的,因为每个大括号字符串都有一个非大括号字符串,但可能涉及 很多 个反斜杠。
是否有任何语法技巧/功能可以让我在 TCL 中粘贴两个 文字 单词,例如将大括号 ({..}
) 单词和双引号 "..."
) 单词连接成一个单词?
我不是在问 set a {foo}; set b "bar\nquux"; set c $a$b
或 append a $b
-- 我知道他们;但是关于没有中间变量或命令的东西。类似于 {*}word
(将单词转换为列表)。
我猜答案是"no way",但我对Tcl的浅薄知识不允许我得出这样的结论。
如果你的单词是一个有效的列表,你可以这样做:
set orig {abc def}
set new [join $orig {}]
如果您使用的是最新的 Tcl 版本(8.6.2 或更高版本),您可以使用
set c [string cat {foo} "bar\nquux"]
对于旧版本,您可以求助于
set c [format %s%s {foo} "bar\nquux"]
没有命令就无法完成您的要求,因为大括号的语法不允许前后有任何内容,一旦您有几个单词,您需要使用命令将它们连接起来 (因为从 Tcl 语言核心的角度来看,这就是命令所做的;采用一些值并产生值结果)。并不是说在字符串中间有大括号是语法错误——它不是——但它确实阻止了它们成为引号字符。要明确:
puts a{b}
打印a{b}
因为{
在那种情况下 不特殊 而是成为值的一部分。puts {a}b
是语法错误。 (唯一的 例外是{*}
,它以{expand}
开头,但 waaaay 太啰嗦了。)
有效的方法:
- 使用
string cat
. - 使用连接程序(例如,
proc strcat {a b} {return $a$b}
- 将两个值都放在大括号内,这样它就是一个组合文字。当然,这只有在两个部分都是文字的情况下才有效。
- 将大括号部分转换为非大括号(和非双引号)形式。这是 总是 可能的,因为每个大括号字符串都有一个非大括号字符串,但可能涉及 很多 个反斜杠。