Tcl中exec_or_print过程实现执行/打印命令及正确变量替换的方法
解决Tcl中exec_or_print过程的实现问题
要实现既能执行调用者上下文的命令,又能打印经过调用者上下文变量替换后的命令内容,核心是要在调用者的上下文中完成变量替换,再将结果打印。
错误原因分析
你原来的代码中,uplevel 1 puts $cmd会把$cmd直接展开,导致最终执行的是puts puts "something $a"——第一个puts把第二个puts当作了通道名,因此报错找不到名为puts的通道。
正确实现代码
proc exec_or_print {cmd} { # 可修改mode值切换执行/打印模式:0=执行,1=打印 set mode 1 if {$mode == 0} { uplevel 1 $cmd } else { # 在调用者上下文完成变量替换,获取展开后的命令 set expanded_cmd [uplevel 1 [list subst $cmd]] puts $expanded_cmd } } set a "temp" exec_or_print { puts "something $a" }
代码说明
- 执行模式:当
mode=0时,直接用uplevel 1 $cmd在调用者上下文执行传入的命令,效果和直接编写该命令完全一致。 - 打印模式:
uplevel 1 [list subst $cmd]:在调用者的上下文中对$cmd进行变量替换(subst命令会处理脚本中的变量和反斜杠序列),得到展开后的命令字符串。- 再用
puts打印这个展开后的字符串,就能得到经过调用者上下文变量替换后的命令内容。
测试结果
当mode=1时,运行代码会输出:
puts "something temp"
当mode=0时,会直接执行命令,输出:
something temp
内容的提问来源于stack exchange,提问作者Mart
相关产品推荐
相关产品推荐

