Tcl:如何替换变量字符串?

Tcl:如何替换变量字符串?,tcl,Tcl,输入文件是一个tcl脚本,它看起来像: set PATH /user/abc/path set PATH2 /user/abc/path2 ... read_verilog ${PATH}/src/vlog/code_1.v read_verilog $PATH/src/vlog/code_2.v read_vhdl ${PATH2}/src/vhd/code_3.vh read_vhdl $PATH2/src/vhd/code_4.vh [other commands ...] read_v

输入文件是一个tcl脚本,它看起来像:

set PATH /user/abc/path
set PATH2 /user/abc/path2
...
read_verilog ${PATH}/src/vlog/code_1.v
read_verilog $PATH/src/vlog/code_2.v
read_vhdl ${PATH2}/src/vhd/code_3.vh
read_vhdl $PATH2/src/vhd/code_4.vh
[other commands ...]
read_verilog ${PATH}/src/vlog/code_1.v
read_verilog $PATH/src/vlog/code_2.v
read_vhdl ${PATH2}/src/vhd/code_3.vh
read_vhdl $PATH2/src/vhd/code_4.vh

需要检查源文件是否存在,并打印出不存在的文件。 如果文件不存在,则输出如下所示:

set PATH /user/abc/path
set PATH2 /user/abc/path2
...
read_verilog ${PATH}/src/vlog/code_1.v
read_verilog $PATH/src/vlog/code_2.v
read_vhdl ${PATH2}/src/vhd/code_3.vh
read_vhdl $PATH2/src/vhd/code_4.vh
[other commands ...]
read_verilog ${PATH}/src/vlog/code_1.v
read_verilog $PATH/src/vlog/code_2.v
read_vhdl ${PATH2}/src/vhd/code_3.vh
read_vhdl $PATH2/src/vhd/code_4.vh
下面是我的脚本:

#!/usr/bin/tclsh
set input_file    "input.tcl"

set input_fpt        [open $input_file r]
set input_lines_all  [read $input_fpt]
set input_lines      [split $input_lines_all "\n"]

set PATH /user/abc/PATH
set PATH /user/dgc/PATH2

foreach line $input_lines {
   if { [string match "read_verilog *" $line] || [string match "read_vhdl*" $line] } {
      regexp {[read_verilog read_vhdl] (.*)} $line matched file

      if { [string match {*[{P]AT[H}]*} $file] } {
         set abs_file [string map {${PATH} /user/abc/PATH} $file]
      } elseif { [string match "*PATH2*" $file] } {
         set abs_file [string map {${PATH2} /user/abc/PATH2} $file]
      } else {
         set abs_file $file
      }

      if { ![file exists $abs_file] } {
         puts $line
      }
   }
}

我的脚本无法检查$PATH,也无法确定是否有更有效的方法来执行此任务。

执行所需替换的最简单方法是使用
字符串映射
命令。首先逐块构建地图,然后将其应用于字符串

set map {} 
lappend map {$PATH} $PATH
lappend map {${PATH}} $PATH
lappend map {$PATH2} $PATH2
lappend map {${PATH2}} $PATH2

set modified [string map $map $inputString] 

构建地图后,您可以根据需要多次应用地图,并一次性或一次性转换数据。但是,您最好只是将文件作为Tcl脚本进行评估。对于某些类型的解析(特别是与安全解释器结合使用时),如果输入是合适的,那么这可能是一种非常有用的方法,而您的输入似乎是合适的

检查puts命令