本打算利用列表进行传参,其实列表也是可以作为参数进行proc传递的,但是我要传入的参数是个变化的值。如下有过程
#输出列表中的第num - 1 个元素 list 是一个列表
proc print {list num} {
puts [lindex $list [expr $num - 1]]
}
foreach i {2 3} {
set aa [print {5 6 7 $i} 4]
}
我想获得的结果是2和3,但是结果却是
$i
查阅资料才知道大括号中的特殊符号都是不起作用的
在tcl中 大括号提供了更加彻底的引用形式,它会取消其他所有特殊字符的特殊意义。如果一个单词以左大括号开头,那么知道与它配对的右大括号为止,所有字符都被原封不动的标识为这个单词的值,这个单词不会发生任何替换,所有的空格、制表符、换行符以及分号包括$ [ ] 都作为普通的字符处理。
注意:在大括号中会执行替换的唯一形式是反斜杠-换行符序列。但是这一替换实际上是在解析命令之前进行的。 \n
这种方式行不通了,就用其他方式吧,我就想着利用数组进行传递。
但是tcl中的数组 不可以作为proc的参数,也不可以作为返回值
可以利用两种方法解决:
1、利用namespace或者upvar 把数组声明在函数外面,成为全局的数组。
2、利用list进行中间过渡进行传递。
下面我主要写一下第二种方式
同样,还是输出最后的一个xx,api保持不变
proc print {list num} {
array set value $
list
puts $value([expr $num - 1])
}
foreach i {2 3} {
array set
my_array [list 0 5 1 6 2 7 3 $i]
set aa [print [array get my_array *] 4]
}
这样在传参之前,先把数组下标和值统一转化为列表,然后再进行传递,传递完之后再转换回来使用,于是就得到想要的结果了。