Tcl:如何获取指定命名空间下用variable关键字声明的所有变量
获取Tcl命名空间中用
variable声明的变量 Tcl没有内置命令直接区分变量是通过variable还是set创建的——两种方式最终都会在目标命名空间中创建变量(若变量不存在)。要精准获取指定命名空间下用variable声明的变量,需通过解析代码的方式实现:
实现思路
- 解析命名空间顶层脚本:提取直接在命名空间下用
variable声明的变量; - 解析命名空间内的所有proc代码:找出proc中通过
variable关键字引用的当前命名空间变量; - 对收集到的变量去重,最终返回结果。
示例实现代码
proc get_namespace_variables {target_ns} { # 用字典存储变量,自动去重 set collected_vars [dict create] # 步骤1:解析命名空间内所有proc的代码,提取variable声明的变量 foreach proc_name [namespace eval $target_ns {info procs}] { set full_proc "${target_ns}::${proc_name}" set proc_body [info body $full_proc] # 匹配proc内的variable命令行,提取变量列表 if {[regexp -all -line {^\s*variable\s+(\w+(?:\s+\w+)*)} $proc_body -> var_names]} { foreach var $var_names { # 仅收集属于目标命名空间的变量(排除跨命名空间引用的变量) if {[namespace qualifiers $var] eq "" || [namespace qualifiers $var] eq $target_ns} { dict set collected_vars $var 1 } } } } # 步骤2:解析命名空间顶层的初始化脚本(需提前持有脚本内容) # 示例:假设命名空间的初始化脚本存储在ns_script变量中 set ns_script { variable showThisVar1 set dontShowThisVar1 1 proc MyProc { } { variable showThisVar2 set dontShowThisVar2 1 } } if {[regexp -all -line {^\s*variable\s+(\w+(?:\s+\w+)*)} $ns_script -> top_var_names]} { foreach var $top_var_names { dict set collected_vars $var 1 } } # 返回去重后的变量列表 return [dict keys $collected_vars] }
使用方法
调用上述proc并传入目标命名空间名,即可得到结果:
puts [get_namespace_variables MyNamespace] # 输出:showThisVar1 showThisVar2
注意事项
- 如果变量是运行时动态通过
variable命令添加的(而非提前写在脚本中),上述解析代码的方式无法捕获。这种场景下可以通过trace add command variable追踪variable命令的调用,实时记录变量名; - 正则匹配需根据实际代码格式调整,确保能正确捕获不同缩进、多变量声明的情况。
内容的提问来源于stack exchange,提问作者ilani
相关产品推荐
相关产品推荐

