在我的Tcl脚本中,我正在用另一种语言构建源代码。例如,让它为gnuplot来源。我有这样的Tcl代码:
# `script' variable contains gnuplot source code set script { set terminal pdf set output "chart.pdf" set title "[makeTitle]" plot "$dataFile" using 1:2 title "" } # Then I write `script' to file for later execution
请注意script
变量包含命令调用(makeTitle
)和变量替换(dataFile
)。源代码本身包含新行,双引号。
问题:如何简单地“评估”此变量,以便通过结果和变量的值替换命令调用?预期结果应如下所示:
set terminal pdf set output "chart.pdf" set title "R(S) Dependence" plot "r_s.txt" using 1:2 title ""
答案 0 :(得分:7)
您正在寻找subst命令:
set result [subst $script]
答案 1 :(得分:1)
我在这种情况下常用的一种方法是使用带有特殊符号的[string map]
。例如:
set script {
set terminal pdf
set output "chart.pdf"
set title "%MAKETITLE%"
plot "%DATAFILE%" using 1:2 title ""
}
set script [string map [list %MAKETITLE% [makeTitle] %DATAFILE% $datafile] $script]
虽然glenn使用[subst]
的答案很好并且适用于您测试的示例代码,但是当原始字符串变得更复杂时,它会遇到问题。具体来说,如果它最终包含Tcl将其解释为要运行的命令或要替换的变量的字符,则最终需要转义它们等。通过使用string map
和非常特定的字符序列来替换,您可以限制那些被改变为你需要的东西。