如何计算列表中重复的单词

时间:2016-11-04 05:39:12

标签: tcl

我有一个单元格列表,

  1. U1864
  2. u_dhm_lut / U4
  3. u_dhm_lut / lut_out_reg_2 _
  4. u_dhm_lut / lut_in_reg_2 _
  5. 我想计算每个名字的出现次数 结果将:

    1. U1864 1
    2. u_dhm_lut / lut_out_reg_2_ 18
    3. u_dhm_lut / lut_in_reg_2_ 14
    4. u_dhm_lut / U4 10
    5. 代码如下:

      set cell_cnt [open "demo.txt" r]
      set cell [read  $cell_cnt]
      set b [open "number_of_cell.txt" w+]
      
      proc countwords {cell_count} {
      set unique_name [lsort -unique $cell_count]
      foreach count $unique_name {
      set cnt 0
      foreach item $cell_count {
      if {$item == $count} {
      incr cnt
      }
      }
      puts $b "$count :: $cnt"
      }
      }
      
      countwords $cell
      

      它说不能读“b”:执行时没有这样的变量     “put $ b”$ count :: $ cnt“” 为什么我不能在proc中写一个文件?

2 个答案:

答案 0 :(得分:1)

过程范围内的代码不能使用在该范围之外定义的变量,例如全局变量。为了能够使用全局变量,您可以将它们导入到过程范围中:

proc countwords cell_count {
    global b

或使用限定名称:

puts $::b ... 

您还可以通过将文件句柄传递给过程来绕过此问题:

proc countwords {b cell_count} {

... 

countwords $b $cell

或移动代码以在程序中打开文件(不推荐:程序应该只有一个作业)。

旧答案,基于问题标题

这是最常见的常见问题之一。如果你在问题列表中回顾一下,你会发现很多答案。

解决方案实际上非常简单,其核心是使用数组作为频率表,单词为键,频率为值。 incr命令根据需要在表中创建新条目(值为1)。

foreach word $words {
    incr count($word)
}

结果同样容易检查:

parray count

结果当然也可以在脚本中以任何可以使用数组的方式使用。

文档: arrayforeachincrparray

答案 1 :(得分:0)

您可以在方法中使用打开的文件代码,即“set b [open”number_of_cell.txt“w +]”。这也应该解决你的问题