Tcl:变量未从给定给foreach循环的列表展开
我很好奇为什么在执行foreach循环时列表中的变量没有展开Tcl:变量未从给定给foreach循环的列表展开,tcl,Tcl,我很好奇为什么在执行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)"; } 输出如下:
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)
与此相反:
输出如下:
>>> (./files/aa.txt)
>>> (./files/bb.txt)
>>> (./files/cc.txt)
>>> ($DIR_FILES/aa.txt)
>>> ($DIR_FILES/bb.txt)
>>> ($DIR_FILES/cc.txt)
我很好奇为什么当我
执行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)";
}
这是因为大括号的使用防止了变量替换的发生参见:
不对大括号中的单词执行变量替换
您可以考虑以下备选方案:
set file_list [list \
$DIR_FILES/aa.txt \
$DIR_FILES/bb.txt \
$DIR_FILES/cc.txt
]
直接创建Tcl列表,而不是列表格式的字符串
或
为了避免反斜杠覆盖多行格式。因为这与原始代码非常接近,所以提供一个关于差异的解释(即如何关闭列表)将非常有用。这将使OP和未来的评论者更容易快速分析正在发生的事情。您可以编辑您的问题以提供解释吗?如果DIR_文件包含空格,这将不会产生所需的结果。这就是为什么通常最好使用list命令来生成列表。请谨慎使用subst选项。当DIR_文件包含空格时,它与将列表括在引号中的问题相同。我的建议是使用list命令的解决方案。