首页 > 解决方案 > 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)

标签: tcl

解决方案


我很好奇为什么当我执行 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
 }]

保留反斜杠以覆盖多行格式。


推荐阅读