#!/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 (<FILE>) { #ファイル内のデータ分繰り返し
	@word=(); #配列@wordを初期化
	$data = $_; #念のため$_を明示的に$dataに代入しています。
	$data =~ s/\.{2,}/ /g; #「...」などの表現をスペースにしています。

#以下のブロックは「.」が文末に来た場合の例外処理と文末の「.」の削除処理
	if ($data !~ /[^A-Za-z-'](($dont)\.)\s+$/){
		$data =~ s/\.\n/\n/;
	}

#ここは数字の処理 ... 22,569.233などを１語で出力
	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から１語ずつ@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を１増
	  }
	}
}
close FILE; #ファイルのクローズ
@word=(); #@wordを再利用するため１度空にする（初期化）
#$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);