我很好奇为什么执行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)
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循环...
这是因为使用花括号可防止发生变量替换(请参见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
}]
保留反斜杠以覆盖多行格式。