首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从第N行执行TCL脚本

从第N行执行TCL脚本
EN

Stack Overflow用户
提问于 2019-05-30 14:42:03
回答 1查看 726关注 0票数 0

我有一个TCL脚本,我在dc shell (Synopsys Design Compiler)中执行了30行自动化代码。我想在第10行停止并退出脚本,退出dc shell,并在执行手动检查后重新启动它。但是,这一次,我希望从第11行开始运行脚本,而不必执行前10行。

与其使用两个脚本,一个包含第10行的代码,另一个包含其余的代码,我只想使用一个脚本,并尝试从第N行开始执行它。

类似于:source a.tcl -line 11

我该怎么做呢?

EN

回答 1

Stack Overflow用户

发布于 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操作,那么您就已经在该限制…之内了

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56373018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档