2017-06-07 228 views
1

输入文件是一个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_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不知道是否有一个更有效的方式来完成这项工作。

+0

check puts command –

回答

0

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

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脚本。对于某些类型的解析来说,这可能是一种非常有用的方法(尤其是与安全解释器结合使用时),如果输入是合适的,那么您的解析似乎是。