tcl - Tcl:变量未从给定 foreach 循环的列表中扩展
问题描述
我很好奇为什么当我执行 foreach 循环时列表中的变量没有扩展......
set DIR_FILES "./files"
# HDL Library Files lists
set file_list {
"$DIR_FILES/aa.txt" \
"$DIR_FILES/bb.txt" \
"$DIR_FILES/cc.txt" \
}
foreach library $file_list {
puts ">>> ($library)";
}
输出是这样的:
>>> (./files/aa.txt)
>>> (./files/bb.txt)
>>> (./files/cc.txt)
而不是这个:
输出是这样的:
>>> ($DIR_FILES/aa.txt)
>>> ($DIR_FILES/bb.txt)
>>> ($DIR_FILES/cc.txt)
解决方案
我很好奇为什么当我执行 foreach 循环时列表中的变量没有扩展......
这是因为使用花括号可以防止发生变量替换(请参阅Tcl doc):
不对大括号中的单词执行变量替换。
您可以考虑以下替代方案:
set file_list [list \
$DIR_FILES/aa.txt \
$DIR_FILES/bb.txt \
$DIR_FILES/cc.txt
]
直接创建一个 Tcl 列表,而不是列表格式的字符串。
或者
set file_list [subst -nocommands -nobackslashes {
$DIR_FILES/aa.txt
$DIR_FILES/bb.txt
$DIR_FILES/cc.txt
}]
保留反斜杠以覆盖多行格式。
推荐阅读
- amazon-web-services - 将时间戳附加到 builspec.yaml 文件中的 S3 存储桶文件夹
- kubernetes - Kubernetes ClusterIP 与无头服务场景
- mysql - 如何在 AWS 上将 RDS 可用区更改为同一区域内的不同可用区?
- java - 序列化在 main 中初始化的对象
- javascript - 在节点中使用 JEST 模拟类
- html - 滚动后如何使 DIV 拉伸到页面底部
- sequelize.js - Sequelize 的 Model.update() 的“值”参数应该是什么样子?
- python - 如何在 Pandas 中删除包含某些文本的行
- javascript - 使用解构从同一对象的属性中使用默认值缩短两个参数
- c# - 如何验证执行 SaveChangesAsync 时是否没有错误?