2016-11-04 3 views
0

リストから繰り返しの単語をカウントする方法、私はセルのリストを持っている

  1. U1864
  2. u_dhm_lut/U4
  3. u_dhm_lut/lut_out_reg_2_
  4. u_dhm_lut/lut_in_reg_2_

そして、それぞれの名前が何回来るか計算したい 結果:

  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

コード等である。

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"を読んでください:実行中にそのような変数がありません "$ b" $ count :: $ cnt ""を入れます なぜprocの中にファイルを書き込めないのですか?

+0

それは*別の*よくある質問です。プロシージャ内のコードが変数 "b"を使用できないのは、その変数がグローバルであるためです。変数を使用する前に、:: bを使用するか、コマンド "global b"(引用符なし)を呼び出します。また、(私の答えのように)周波数を数えるためのもう少し簡単なコードの使用を検討してください。将来同じコードを使って作業していれば、あなたはあなたに感謝します。 –

答えて

1

プロシージャスコープ内のコードは、そのスコープの外で定義された変数を使用できません。グローバル変数。

proc countwords cell_count { 
    global b 

または修飾名を使用します:

puts $::b ... 

あなたはまたにファイルハンドルを渡すことによって、問題を回避することができますが、プロシージャのスコープにインポートすることができ、グローバル変数を使用できるようにするにはプロシージャ:

proc countwords {b cell_count} { 

... 

countwords $b $cell 

のいずれかでファイルを開くためのコードを移動します(推奨されていません。手順には1つのジョブのみが必要です)。

旧答え、質問のタイトル

に基づいてこれが最も頻繁に尋ねたのですが、頻繁に質問をしました。あなたが質問リストでしばらく見ていれば、これにはかなりの答えがあります。

解決策は実際には非常に簡単です。その中核は、キーを単語として、周波数を値として周波数テーブルとして配列を使用することです。 incrコマンドは、必要に応じてテーブルに新しいエントリ(値は1)を作成します。

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

結果を確認することが同様に容易である:

parray count 

結果はもちろん、アレイを使用することができることをどのような方法でスクリプトで使用することができます。

ドキュメント: arrayforeachincrparray

+1

辞書も頻度テーブルとして機能します。 –

+0

さて、私はそれをチェックしましょう...ありがとう... – CLEX420

0

あなたはメソッドの内部で "[ "+ W number_of_cell.txt公開】" Bセット" すなわち、開いているファイルのコードを使用することができます。これもあなたの問題を解決するはずです

+0

ありがとう...それは私の心に来なかった... – CLEX420

関連する問題