我有一个TCL脚本,我在dc shell (Synopsys Design Compiler)中执行了30行自动化代码。我想在第10行停止并退出脚本,退出dc shell,并在执行手动检查后重新启动它。但是,这一次,我希望从第11行开始运行脚本,而不必执行前10行。
与其使用两个脚本,一个包含第10行的代码,另一个包含其余的代码,我只想使用一个脚本,并尝试从第N行开始执行它。
类似于:source a.tcl -line 11
我该怎么做呢?
发布于 2019-05-30 20:44:39
最简单的方法是打开文本文件,解析它以获得前N个命令(info complete
在这里很有用),然后计算这些命令(或脚本的其余部分)。有效地执行此操作会在丢弃尾部时生成与丢弃前缀时略有不同的代码。
proc ReadAllLines {filename} {
set f [open $filename]
set lines {}
# A little bit careful in case you're working with very large scripts
while {[gets $f line] >= 0} {
lappend lines $line
}
close $f
return $lines
}
proc SourceFirstN {filename n} {
set lines [ReadAllLines $filename]
set i 0
set script {}
foreach line $lines {
append script $line "\n"
if {[info complete $script] && [incr i] >= $n} {
break
}
}
info script $filename
unset lines
uplevel 1 $script
}
proc SourceTailN {filename n} {
set lines [ReadAllLines $filename]
set i 0
set script {}
for {set j 0} {$j < [llength $lines]} {incr j} {
set line [lindex $lines $j]
append script $line "\n"
if {[info complete $script]} {
if {[incr i] >= $n} {
info script $filename
set realScript [join [lrange $lines [incr j] end] "\n"]
unset lines script
return [uplevel 1 $realScript]
}
# Dump the prefix we don't need any more
set script {}
}
}
# If we get here, the script had fewer than n lines so there's nothing to do
}
请注意,您正在处理的文件类型可能会变得非常大,而且Tcl目前有一些硬内存限制。另一方面,如果您能够对文件执行source
操作,那么您就已经在该限制…之内了
https://stackoverflow.com/questions/56373018
复制相似问题