tcl程序不起作用

时间:2013-12-13 01:06:17

标签: regex 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\> "

3 个答案:

答案 0 :(得分:1)

以下是一些观察。

  • 您的代码确实会输出正文 html 标记
  • 您编写了程序get_clp_summary,但没有调用它。这就是为什么它不输出任何东西。你需要这样称呼它:

    get_clp_summary filename
    
  • 请不要使用缩写/短手。我花了一段时间才弄明白 o / p 意味着输出。是的,我是那么傻。

  • 作为一种风格问题,请为您的代码缩进。它应该对可读性有很大帮助。

答案 1 :(得分: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>"

答案 2 :(得分: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}件,因为它是一个值,而不是标签就是你想要的。如果我的假设是错误的,请恢复。