使用TCL Upvar命令的代码为何报错?求故障排查
TCL upvar命令报错原因分析
问题代码
#!/usr/bin/env tclsh proc run_check {} { set src dut.acore.B2.Vin set conlist1 [list dut.acore.B2.Vin dut.acore.N1__Bidir_2__ddiscrete_5.Aout dut.acore.DCORE.CLK] puts $conlist1 set conlist2 [_lremove $conlist1 $src true] puts $conlist2 } proc _lremove {listName val {byval false}} { upvar 1 $listName list puts $list #if {$byval} { # set list [lsearch -all -inline -not $list $val] #} else { # set list [lreplace $list $val $val] #} return $__list } ###################################### ##Run Command ###################################### puts [run_check]
报错信息
(base) ./remove.tcl dut.acore.B2.Vin dut.acore.N1__Bidir_2__ddiscrete_5.Aout dut.acore.DCORE.CLK can't read "list": no such variable while executing "puts $list" (procedure "_lremove" line 4) invoked from within "_lremove $conlist1 $src true" (procedure "run_check" line 6) invoked from within "run_check" invoked from within "puts [run_check]" (file "./remove.tcl" line 35)
错误原因
- upvar使用逻辑错误:
upvar的作用是关联调用者作用域中的变量,需要传入变量名而非变量的值。你调用_lremove $conlist1 $src true时,$conlist1会被解析成列表的实际内容,_lremove中的upvar 1 $listName list会尝试在run_check的作用域里找名为该列表内容的变量——显然不存在这个变量,因此触发"can't read 'list'"错误。 - 返回变量名笔误:代码最后
return $__list是错误写法,你通过upvar关联的变量名是list,而非__list。
修正方案
- 调用
_lremove时传入变量名,去掉$:
set conlist2 [_lremove conlist1 $src true]
- 修正返回语句:
return $list
内容的提问来源于stack exchange,提问作者Rajat Mitra
相关产品推荐
相关产品推荐

