Tcl:处理列表中的变量

时间:2015-11-13 08:37:54

标签: loops tcl

也许这是非常愚蠢的,但我真的无法找到解决方案。我创建了两个变量,并希望将它们转换为列表。 这些命令是特定于工具的,但它们以我想要的方式工作:

redirect max_transition {report_constraint -view $pargs(-scenario) -drv_violation_type {max_transition} -all_violators} -variable
redirect max_capacitance {report_constraint -view $pargs(-scenario) -drv_violation_type {max_capacitance} -all_violators} -variable

现在我想从中创建tcl列表。我可以使用循环,因为数据具有相同的结构。

set reports {$max_transition $max_capacitance}
set report_length [llength $reports]

for {set i 0} {$i < $report_length} {incr i} { 
    set tns_value 0
        set max_wns 0
    set vios 0

    set report [lindex $reports $i]
    puts $report

    # remove all uneccessary white spaces
    set no_space [regexp -all -inline {\S+} $report]

    # insert a new line for every path
    set insert_lines [string map {" U_" \nU_} $no_space]

    # create list out of result reports
    set report_list [split $insert_lines "\n"]

    if {[llength $report_list] > 1} {
        for {set i 1} {$i < [llength $report_list]} {incr i} {
            # get value of violation
            set slack [lindex [split [lindex $report_list $i] " "] 3]

            set tns_value [expr $tns_value + $slack]
            if {$vios == 0} {set max_wns $slack}
            incr vios 
        }
    }
    # write out values
    puts "$pargs(-scenario), $report, $max_wns, $tns_value, $vios"
}

但这没有用。循环只是输出变量的名称(因为&#34;放置$ report&#34;)而不是它的内容。 如果我没有循环(所以每个变量连续相同的代码),我得到我想要的列表。 那么如何在循环中整体处理这些变量呢?

2 个答案:

答案 0 :(得分:0)

问题出在下面的循环变量i中,它覆盖了外循环的变量值。尝试将内循环变量更改为j

    for {set i 1} {$i < [llength $report_list]} {incr i} {
        # get value of violation
        set slack [lindex [split [lindex $report_list $i] " "] 3]

        set tns_value [expr $tns_value + $slack]
        if {$vios == 0} {set max_wns $slack}
        incr vios 
    }

答案 1 :(得分:0)

很难为此写一个答案,因为这么多未知。首先,您可能应该按照listforeach循环更改为分配:

set reports [list $max_transition $max_capacitance]

foreach report $reports {

由于您不需要在此处使用for循环,因此简化它是有意义的。请评论,如果可以,我会反复改进答案。