Tcl开发问题:如何以变量作为数组名获取对应数组的值
问题分析与解决
原代码的核心问题
- 遍历逻辑错误:
foreach f {files}是遍历字面量字符串files,而非变量$files的内容,需改为foreach f $files - 数组存储不完整:
array_proc仅将time存入数组,遗漏了date字段 - 数组元素访问错误:Tcl不支持
$$f_name(time)这种直接嵌套替换,需用间接变量替换访问以变量为名称的数组元素
修正后的完整代码
1. 完善数组存储过程
补充date字段的存储:
proc array_proc {f} { global f_name set f_name [file tail $f] set mtime [file mtime $f] set date [clock format $mtime -format %D] global $f_name # 同时存入time和date两个数组元素 array set $f_name [list time $mtime date $date] }
2. 修正遍历与数组访问逻辑
用set命令实现间接访问数组元素:
set files [list /home/dir1/a.txt /home/dir2/b.txt] # 遍历变量$files的内容而非字面量 foreach f $files { array_proc $f # 间接获取数组元素:先拼接完整变量名,再用set取值 puts "$f $f_name [set "${f_name}(time)"] [set "${f_name}(date)"]" }
执行结果
运行后将输出符合预期的内容:
/home/dir1/a.txt a.txt 4123123 03/07/2012 /home/dir2/b.txt b.txt 5123123 03/02/2011
关键Tcl语法点
当数组名称存储在变量中时,必须通过间接变量替换访问元素:
- 语法格式:
set "${数组名变量}(元素键)" - 原理:先拼接出完整的数组元素变量名(如
a.txt(time)),再通过set命令获取对应值
内容的提问来源于stack exchange,提问作者Linh Trần Quang
相关产品推荐
相关产品推荐

