2013-12-13 4 views
0

Я пишу процедуру для ошибок/серьезности/возникновения из файла в таблицу, но не работает.Процедура 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

Это не o/p ничего – 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 $ кол» (процедура «get_clp_summary» строка 13) вызывается из «get_clp_summary [lindex $ argv 0] " , вызванный с " set 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}, так как считается, что это значение, а не метка - это то, что вы хотите. Пожалуйста, верните, если мое предположение было неправильным.

Смежные вопросы