输入文件是一个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 :(得分:1)
执行所需替换的最简单方法是使用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脚本。对于某些类型的解析(特别是与安全解释器一起使用时),这可能是一种非常有用的方法,如果输入是合适的,那么您的解析似乎是这样。