Tcl:变量未从给定给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)"; } 输出如下:

我很好奇为什么在执行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)
与此相反:

输出如下:

>>> (./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命令的解决方案。