Monday, May 5, 2008

uplevel command ...

  将起参数连接起来(象是在concat中)。最后在由level所指定的上下文中来执行。如果level是一个整数,给出了在栈中的距离(是跳到其它的命令环境中来执行)。缺省为1(即上一层)。

  如:


#!/usr/bin/tcl
proc ff {} {
set a "ff" //设置了局部的a
-------------------------
}
set a "global"
ff
puts $a
//return "global"

  再看下一个:


#!/usr/bin/tcl
proc ff {} {
uplevel set a "ff" //改变上一级栈中的a
-------------------------------------
}
set a global
ff
puts $a
//return "ff"

  如果level是以#开头后接一个整数,则level指出了在栈中的绝对位置。如#0表示了顶层(top-level)。

  a b c 分别为三个命令,下面是它们之间的调用关系,

top-level -> a -> b -> c -> uplevel level

  绝对位置: 0 1 2 3

  当level为 1 或 #2 都是在 b 的环境中来执行。

  3 或 #0 都是在 top-level 的环境中来执行。

upvar ?level? otherVar myVar ?otherVar myVar ...?

  在不同的栈中为变量建立连接。这里的level与uplevel中的level是同样风格的。

  例如:


#!/usr/bin/tcl
proc ff {name } {
upvar $name x
set x "ff"
}
set a "global"
ff a
puts $a
//return "ff"


================================

http://www.tclchina.com/article/translation/tcl_hanchan_intro/tcl_hanchan_cn.htm

upvar 也可以被用于访问在调用栈的不同层次上的变量。

    upvar #0 other x

通过本地变量 x 来使全局变量 other 可访问(#0 指定访问全局变量 other 而不管调用栈的层次)。

    upvar 2 other x

使在当前的过程的调用者的调用者中的变量 other 作为本地变量 x 访问(2 指定在调用栈中两层之上)。




#!/usr/bin/expect -f

set force_conservative 0

set timeout -1
spawn $env(SHELL)
match_max 100000
send -- "telnet 172.16.67.199\r"
expect "login: "
send -- "admin\r"
expect "Password: "
send -- "\r"

send -- "config system global\r"
expect "#"

No comments: