跨作用域访问TCL中的变量

跨作用域访问TCL中的变量,tcl,Tcl,我正在努力学习tcl脚本。我的要求很简单。我需要访问for循环中第二个if条件中的数组“args”。我尝试了下面的代码。由于“argv”范围被限制为第二个if条件,所以在for循环中无法访问它 然后我尝试将argv声明为全局变量- 数组集args{} 在第一个if条件的ned的正下方。即使在将“args”声明为全局数组后也没有帮助 如何访问下面for循环中second if contion范围内的变量 if {$argc != 4} { puts "Insufficient arguments"

我正在努力学习tcl脚本。我的要求很简单。我需要访问for循环中第二个if条件中的数组“args”。我尝试了下面的代码。由于“argv”范围被限制为第二个if条件,所以在for循环中无法访问它

然后我尝试将argv声明为全局变量-

数组集args{}

在第一个if条件的ned的正下方。即使在将“args”声明为全局数组后也没有帮助

如何访问下面for循环中second if contion范围内的变量

if {$argc != 4} {
puts "Insufficient arguments"
exit 1
}

if { $::argc > 0 } {
    set i 1
    foreach arg $::argv {
        puts "argument $i is $arg"
        set args(i) arg
        incr i
        }
} else {
    puts "no command line argument passed"
}

for {set x 0} { $x<2 } {incr x} {
    puts "Arrray: [lindex $args $x]"
}
如果{$argc!=4}{
放入“参数不足”
出口1
}
如果{$::argc>0}{
第一组1
foreach arg$::argv{
放置“参数$i是$arg”
设置args(i)arg
增量i
}
}否则{
放置“未传递命令行参数”
}

对于{set x 0}{$xTcl默认情况下不导入全局变量。您需要导入全局变量:

global args
set args(i) arg
有些人更喜欢在程序顶部导入全局变量:

global args

if {$argc != 4} {
    puts "Insufficient arguments"
    exit 1
}

if { $::argc > 0 } {
    set i 1
    ....
见:

或者,您可以直接访问全局名称空间,事实上您已经将该语法用于
::argc

set ::args(i) arg

对于您的原始代码,这是我得到的错误:

can't read "args": variable is array
    while executing
"lindex $args $x"
    ("for" body line 2)
    invoked from within
"for {set x 0} { $x<2 } {incr x} {
    puts "Arrray: [lindex $args $x]"
}"
    (file "main.tcl" line 20)
但是在元素的设置中也缺少了一些
$

        set args($i) $arg
看起来更好。最终代码:

if {$argc != 4} {
puts "Insufficient arguments"
exit 1
}

if { $::argc > 0 } {
    set i 0
    foreach arg $::argv {
        puts "argument $i is $arg"
        set args($i) $arg
        incr i
        }
} else {
    puts "no command line argument passed"
}

for {set x 0} { $x<2 } {incr x} {
    puts "Arrray: $args($x)"
}
如果{$argc!=4}{
放入“参数不足”
出口1
}
如果{$::argc>0}{
设置i 0
foreach arg$::argv{
放置“参数$i是$arg”
设置参数($i)$arg
增量i
}
}否则{
放置“未传递命令行参数”
}
对于{set x 0}{$xIt,最好不要调用变量
args
,除非它是过程的特殊最终形式参数,因为它具有不同寻常的(但有很好的文档记录)语义,否则会让所有人感到困惑。
    set i 0
        set args($i) $arg
if {$argc != 4} {
puts "Insufficient arguments"
exit 1
}

if { $::argc > 0 } {
    set i 0
    foreach arg $::argv {
        puts "argument $i is $arg"
        set args($i) $arg
        incr i
        }
} else {
    puts "no command line argument passed"
}

for {set x 0} { $x<2 } {incr x} {
    puts "Arrray: $args($x)"
}