【问题标题】:How to read the variable Name which store the value如何读取存储值的变量名称
【发布时间】:2016-08-11 07:24:52
【问题描述】:

TCL 程序示例:

proc fun { x } {
    puts "$$x = $x"
}
set a 10
fun $a

在上面的程序中,将输出打印为$10 = 10 但我想得到a = 10 的输出。必须读取传递值的变量以及相应的值。有没有办法读取变量名。

【问题讨论】:

  • $ 是取消对变量值的引用,但您要给出值来代替它。除非您有另一个变量指向您的实际变量,否则您不能取消引用相同的变量。请记住,变量名可以是唯一的,但值不是。多个变量也可以具有相同的值。

标签: tcl tclsh


【解决方案1】:
proc fun name {
    upvar 1 $name var
    puts "$name = $var"
}
set a 10
fun a

upvar 命令采用一个名称并创建具有该名称的变量的别名。

文档: proc, puts, set, upvar

【讨论】:

    【解决方案2】:

    如果您有当前支持的 Tcl 版本(8.5 或 8.6),您可以使用info frame -1 来查找有关调用者的一些信息。其中包含各种信息,但我们可以像这样进行合理的近似:

    proc fun { x } {
        set call [dict get [info frame -1] cmd]
        puts "[lindex $call 1] = $x"
    }
    
    set a 10
    fun $a
    # ==> $a = 10
    fun $a$a
    # ==> $a$a = 1010
    

    现在,lindex 的使用是完全错误的;它是 Tcl 代码,而不是列表(如果您使用复杂的命令替换,您会看到不同之处)。但是,如果您只使用一个相当简单的词,它就足够了。

    【讨论】:

      【解决方案3】:
      % set x a
      a
      % set a 10
      10
      % eval puts $x=$$x
      a=10
      % puts "$x = [subst $$x]"
      a = 10
      % puts "$x = [set $x]"
      a = 10
      %
      

      如果你将变量传递给一个过程,那么你应该依赖upvar

      【讨论】:

        猜你喜欢
        • 2021-11-17
        • 1970-01-01
        • 1970-01-01
        • 2010-12-27
        • 1970-01-01
        • 1970-01-01
        • 2015-10-28
        • 2017-09-07
        相关资源
        最近更新 更多