2013-12-13 223 views
0

我正在編寫一個程序o/p從文件到表格格式的錯誤/嚴重性/發生,但它不起作用。tcl程序不能正常工作

片段文件:

error_name: xxxxxxxxxx 
Severity: Warning Occurrence: 2 
error_name2:xxxxxxxxxxx. 
Severity: Warning Occurrence: 16 
error_name3:xxxxxxxxxxxxx 
Severity: Warning Occurrence: 15 

代碼:

proc get_clp_summary { Infile } { 
    set run_summary_file [ glob $Infile/summary.rpt ] 

    set fp [ open $run_summary_file "r" ] 

    while { [ gets $fp line ]!= -1 } { 
     foreach {match label value} [regexp -inline -all {(\w+):\s*(\S*)} $line] { 
     switch -exact -- $label { 
      Severity {set sev $value} 
      Occurrence {set count $value} 
      default {set err $label} 
     } 
     lappend pack_stats [ list $err $sev $count] 
     puts $pack_stats    
     } 

     return $pack_stats 
    } 


    ################################################################## 

    set run_time_stats [ get_clp_summary [ lindex $argv 0 ] ] 

    puts "" 
    puts "" 
    puts "" 

    table_styler 
    puts " \<table id=\"customers\" style=\"margin-bottom:10px;\" \> " 
    puts "\<th\> Rule \<\/th\>" 
    puts "\<th\> Severity \<\/th\>" 
    puts "\<th\> Occurrence \<\/th\>" 
    puts "\<\/tr\>" 
    foreach k $run_time_stats { 

     set st [ lindex $k 0 ] 
     set st_type [ lindex $k 1 ] 
     set st_count [lindex $k 2] 
     set BGCOLOR #FFFFFF 
     puts " \<tr\> \<td\> $st \<\/\> \<td bgcolor=\"$BGCOLOR\" \> $st \<\/td\> " 
     puts "\<td\> \<td bgcolor=\"$BGCOLOR\" \> $st_type \<\/td\> \"       
     puts "\<td\> $st_count \<\/td\> " 
     puts "\<\/tr\>" 
    } 

    puts " \<\/table\> " 
} 

puts " \<\/body\> " 
puts " \<\/html\> " 
+2

請定義「不工作」。它給你什麼?一個錯誤?沒有輸出? –

+0

它沒有任何東西 – tcluser16

回答

1

這裏有一些觀察。

  • 您的代碼不會輸出HTML標籤
  • 你寫的程序get_clp_summary,但並沒有把它。這就是爲什麼它不輸出任何東西。你需要這樣稱呼它:

    get_clp_summary filename 
    
  • 請不要使用縮寫/短手。我花了一段時間才弄清楚o/p意味着輸出。是的,我很愚蠢。

  • 作爲一個風格問題,請爲您的代碼縮進。它應該大大有助於可讀性。
+0

+1爲「請不要使用縮寫」。有ppl是帽子​​。用很多abvr寫東西,所以n/o可以理解。 –

0

您的主要問題是您的縮進不乾淨。一件簡單的事情,但它造成你主要的問題。

這是爲什麼。當我重新提交您的提交時,我發現程序get_clp_summary實際上比我最初想象的晚了很多行!這意味着它永遠不會被調用(有一個來自程序內部的不可達代碼的遞歸調用,我認爲你不需要)。如果你得到了縮進的權利,也許使用程序員編輯的支持,那麼你會更迅速地找到像放錯位置的花括號這樣的問題。

修復代碼,以大括號後:

puts " \<\/table\> " 

,並把它之前

return $pack_stats 

哦,還有很多代碼等問題。至少有一個反斜槓會導致該HTML打印部分出現混亂(並且無論如何,Tcl在<>之前不需要\)。更重要的是,你不關閉你正在閱讀的頻道,並且你假設glob返回一個文件(它返回一個列表,即使它是一個有一個元素的列表)。你可能想看看使用subst,像這樣:

puts [subst { 
<table id="customers" style="margin-bottom:10px;"> 
    <tr> 
     <th> Rule </th> 
     <th> Severity </th> 
     <th> Occurrence </th> 
    </tr> 
}] 
foreach k $run_time_stats { 
    # Consider using: lassign $k st st_type st_count 
    set st [lindex $k 0] 
    set st_type [lindex $k 1] 
    set st_count [lindex $k 2] 
    set BGCOLOR "#FFFFFF" 
    puts [subst { 
     <tr> 
     <td bgcolor="$BGCOLOR"> $st </td> 
     <td bgcolor="$BGCOLOR"> $st_type </td> 
     <td> $st_count </td> 
     </tr> 
    }] 
} 
puts "</table>" 
+0

謝謝,我嘗試過,但它給錯誤無法讀取「SEV」:在執行 「列表$ ERR $ SEV $計數」 (程序「get_clp_summary」 13號線) 內 從調用「get_clp_summary沒有這樣的變量 [LINDEX $ ARGV 0]「 從調用內 」設置run_time_stats [get_clp_summary [LINDEX $ ARGV 0]「 – tcluser16

+0

喜有人可以對這個建議?它不會返回任何東西 – tcluser16

0

的問題是與foreach環路由線分析文件中的行。一旦讀取第一行,它沒有嚴重性或計數信息,因此它失敗,因爲變量$sev$count仍未設置。

一個相當粗糙,但工作的例子,並沒有偏離你的代碼太遠會是這樣的。

while { [ gets $fp line ]!= -1 } { 
    foreach {match label value} [regexp -inline -all {(\w+):\s*(\S*)} $line] { 
     switch -exact -- $label { 
      Severity {set sev $value} 
      Occurrence {set count $value} 
      default {set err $value} 
     } 
     if { [info exists err] && [info exists sev] && [info exists count] } { 
      lappend pack_stats [ list $err $sev $count] 
      unset err sev count 
     } 
    } 

它檢查,直到所有三個變量的收集和設置,然後追加回列表,然後會取消他們,使他們可以再次回收。還糾正了default {set err $label}作品認爲它是一個價值,而不是標籤是你想要的。如果我的假設錯誤,請回復。