如何提取传递给TCL proc的表达式中的变量名?
解决Tcl提取表达式中变量名的问题
你原来的方法存在两个核心问题:
- 按空格分割字符串会破坏包含特殊符号(比如
[)的变量上下文,导致[$a被当成一个独立元素 lsearch的通配符{*$*}是匹配整个元素包含$,而非提取元素中$开头的变量部分
改用正则表达式可以精准提取所有符合Tcl变量命名规则的变量名,以下是修正后的代码:
proc getvariables {q} { # 匹配所有$开头,后跟字母/下划线,再跟字母/数字/下划线的变量 set vars [regexp -all -inline {\$\w+} $q] puts $vars } getvariables {expr [$a + $b]}
执行这段代码后,输出结果为:
$a $b
补充说明
- 正则
\$\w+中,\$匹配字面量$,\w+匹配一个或多个字母、数字或下划线,完全符合Tcl基础变量名的命名规则 - 如果需要支持带数组索引的变量(比如
$arr(index)),可以将正则调整为\$\w+(?:\([^)]+\))?,即可提取这类复杂变量
内容的提问来源于stack exchange,提问作者VAR
相关产品推荐
相关产品推荐

