#!/usr/local/bin/perl $directory="data"; #目的のファイルがあるフォルダの名称 $file="wowcat\.txt"; #ファイルの名称。「\.」としてありますが\はなくてもほぼOK $separator=":"; #パスをつなぐ記号で、機種固有値(UNIX... / Mac... :) $in=$separator.$directory.$separator.$file; #相対パスでファイルを指定 $out="wlist\.txt"; #出力ファイル #区切り文字データ $sep = "\\s|,|\\\"|\\(|\\)|\\?|!|;|:|\\\/|\\[|\\]"; #区切り文字例外マッチングパターン - 「.」の場合の例外処理 $dont="\[A-HJ-Z\]|M(r|s|rs)|Dr|Calif|V[Aa]|[MS][Tt]|Jan|Feb|Mar|Apr|Aug|Sep(t|)|Oct|Nov|Dec|Assoc|Co|Gov|Se(n|c)|Ont|i\\\.e|e\\\.g|v(s|)|Pa|Fla|Re(p|v)|Gen|Univ|Jr|[fF]t|[Ss]gt|[Pp]res|[Pp]rof|etc|al|[AaPp]\\\.[Mm]"; open (FILE, $in) || die "$in\n$!\n"; #ファイルオープン while () { #ファイル内のデータ分繰り返し @word=(); #配列@wordを初期化 $data = $_; #念のため$_を明示的に$dataに代入しています。 $data =~ s/\.{2,}/ /g; #「...」などの表現をスペースにしています。 #以下のブロックは「.」が文末に来た場合の例外処理と文末の「.」の削除処理 if ($data !~ /[^A-Za-z-'](($dont)\.)\s+$/){ $data =~ s/\.\n/\n/; } #ここは数字の処理 ... 22,569.233などを1語で出力 while (1) { if ($data =~ /[^A-Za-z-'!\?]([\d\.,]+)[^A-Za-z-'!\?]/) { #数字列を検索したら push (@word, $1); #それだけ先に@wordにプッシュし、 $data = $`." ".$'; #$dataを数字を抜いた文字列に書き換える } else { last; } } @array = split($sep, $data); #文字列を$sepで分割し、@arrayに格納 foreach $yoso (@array) { #@arrayから1語ずつ@wordに格納 push(@word, $yoso); #これは数字の例外を処理するためだけのやや冗長な処理 } #以下は空白要素を削除しながら語数をカウントするブロック @word = sort @word; for ($i=0; $i<=$#word; $i++) { if ($word[$i] eq '') { splice (@word, $i, 1); $i--; } else { #この後から連想配列への代入処理 $word[$i] =~ tr/A-Z/a-z/; #大文字を小文字に変換 $assoc{$word[$i]}++; #%assocという連想配列のkey $word[$i]のvalueを1増 } } } close FILE; #ファイルのクローズ @word=(); #@wordを再利用するため1度空にする(初期化) #$totalで総語数もカウント $total=0; while (($key, $value) = each %assoc) { #each関数でkeyを$keyへ、valueを$valueへ格納 push (@word, join("\t", $key,$value)); #key(TAB)valueという要素に変換して配列へ格納 $total+=$value; #総語数計算 } @word = sort @word; #alphabetical orderにするためのソート open (FILE, "> $out") || die "Can't create $out\n$!\n"; #出力ファイルオープン foreach $yoso (@word) { print $yoso, "\n"; #結果を出力 print FILE $yoso, "\n"; #結果をファイルへ出力 } print "\ntotal... $total\n"; #総合計表示 print FILE "\ntotal... $total\n"; #総合計をファイルへ出力 close FILE; exit (0);