我有一个单元格列表,
我想计算每个名字的出现次数 结果将:
代码如下:
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中写一个文件?
答案 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
结果当然也可以在脚本中以任何可以使用数组的方式使用。
答案 1 :(得分:0)
您可以在方法中使用打开的文件代码,即“set b [open”number_of_cell.txt“w +]”。这也应该解决你的问题