Tcl中的大型文本替换

时间:2012-01-03 13:12:12

标签: tcl

在我的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 ""

2 个答案:

答案 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和非常特定的字符序列来替换,您可以限制那些被改变为你需要的东西。