错误:无法读取....在TCL脚本中没有这样的变量使用""

时间:2015-03-25 08:24:32

标签: variables scope global-variables tcl

我在我工作场所的TCL自动化环境中工作。 我正在尝试使用“after”在我的脚本中运行延迟命令。 我遇到的问题是,当我尝试在“后”下的代码块内部使用变量指定命令时,无法识别变量并且我收到错误消息。 我将引用代码的相关部分。

proc test_script1 {{bh0 0} ...more vars....} {
.
.
.
after [expr 20000]   {
   set some_value[ ns1::probe_TCP_connections $bh0 $main_duration 1  15]    }

puts "the value i got is $some_value"
}

我似乎得到一个错误: 无法读取“some_value”:没有这样的变量

任何人都可以提出问题是什么,以及如何过度使用它? THX

2 个答案:

答案 0 :(得分:3)

您可以在apply的帮助下捕获局部变量的值(建议使用list构建回调,当它们甚至有点不平凡时)。由于apply的主体是一个具有自己范围的lambda表达式 - 一个无名的过程 - 你必须在其中使用global来访问将持久存在的状态,并且无论如何{{1}总是从全局命名空间调用回调函数(因为该机制不知道如何在异步操作期间保持任意堆栈帧。)

after

有可能变得更复杂,特别是在Tcl 8.6中,它有一个可以用来隐藏使用连续传递样式编程的复杂性的协程系统。

答案 1 :(得分:1)

这是proc,它会做与您尝试做的事情类似的事情:

proc foo {} {
    # Make 'a' available to both the global scope and local scope
    global a
    # This is to check the current level
    puts "Current level: [info level]"
    # The command to be run in 500 ms, and I have added another check for the level
    after 500 {puts "Current level: [info level]"; set a 100}
    # Wait for further execution until the global variable 'a' changes
    vwait a
    # Prints a
    puts "Value of \$a: $a"
}

以上的输出将是:

Current level: 1
# After 500 ms, the below will print
Current level: 0
Value of $a: 100

当您使用after时,变量a将在全局范围内创建,除非明确授予访问权限,否则proc无法访问该变量。最简单的方法之一是首先确保proc中的a可以全局和本地访问,global(级别0)。