使用tcl split解决`list element in braces with "]" instead of space`导致`unmatched open brace in list`

Using tcl split to solve `list element in braces followed by "]" instead of space` causes `unmatched open brace in list`

(这是来自 nagelfar 插件——它是一个用 tcl 编写的 tcl 分析器,这就是 $x 包含 tcl 代码的原因。)

在 tcl 中 shell:

% set x {proc {::$p} args {[subst { foo }]} }
proc {::$p} args {[subst { foo }]} 
% 
% lindex $x 3 0
list element in braces followed by "]" instead of space

根据 http://forum.egghelp.org/viewtopic.php?t=2603 解决方案是使用 split,但是:

% lindex [split $x] 3 0
unmatched open brace in list

对内容如上$x的变量使用lindex的正确方法是什么?

原始字符串$x可以像一个简单的列表一样处理...

% set x {proc {::$p} args {[subst { foo }]} }

% foreach item $x { puts $item}
proc
::$p
args
[subst { foo }]

...但不是列表列表。 [subst { foo }] 格式不正确,无法成为列表。

% lindex $x 3 0
Error: list element in braces followed by "]" instead of space
        Use error_info for more info. (CMD-013)

如果一个字符串可以用白色 space 分隔并且可以选择使用引号或大括号进行分组,则可以将其视为 list in Tcl。字符串 [subst { foo }] 的最后一个白色 space 分隔部分是 }]。这可以防止第一个 { 字符形成分组匹配。

对于这个特定的字符串,您可以先从 $x 中获取第 4 个项目,然后使用 split 获取第一个项目。

% lindex [split [lindex $x 3]] 0
[subst

在一般情况下,您可以在每次出现 } 后插入一个 space。

% set y [regsub -all "\}" $x "\} "]
proc {::$p}  args {[subst { foo } ]}
% lindex $y 3 0
[subst