#!/usr/local/bin/perl #!D:/Perl/bin/perl.exe #--------------------------------------------------------------------------------- # AN HTTPD用refererファイル解析Perlスクリプト(jcode.pm や Encode モジュール使用) # URL:http://sakaguch.com 電子メール:http://sakaguch.com/cgi/postmail/ より送信して下さい。 # ファイル名:referer.pl 2002.10.27 作成:鷹の巣 http://sakaguch.com/ #--------------------------------------------------------------------------------- # 参考:Perlメモの「全角英数字を半角英数字に変換する」 # URL http://www.din.or.jp/~ohzaki/perl.htm#JP_Z2H # # 色々 TIPS # http://www.cybercom.co.jp/~mikio/other/tips_contents.html # # Shift_JISテキストを正しく扱う # http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm # # 日本語の扱い - Perlで日本語を扱うためのメモ。 # http://digit.que.ne.jp/work/index.cgi?%C6%FC%CB%DC%B8%EC%A4%CE%B0%B7%A4%A4 #--------------------------------------------------------------------------------- # 改版記録: # 2002.10.27 Rev.0.000 初版 # 2002.11.04 Rev.0.100 アクセス元URLと検索キーに使用頻度を追加。 # 2002.11.10 Rev.0.101 アクセス元URLと検索キーに使用頻度を追加。 # 2002.11.17 Rev.0.200 アクセス元ホスト名単位の頻度を追加。 # 2002.11.23 Rev.0.300 検索キーの単語単位の頻度を追加。 # 2003.12.15 Rev.0.301 検索キーの単語の文字化け対策。置換処理の順番を一部変更。 # 2003.02.11 Rev.1.000 コメントを追加して、公開。 # 2003.02.13 Rev.1.100 Perl 5.8以降のencodeモジュールに対応。 # 2003.02.16 Rev.1.101 encodeモジュールの文字コード識別が不完全な為、検出回路追加。 # 2003.02.17 Rev.1.102 encodeモジュールの文字コード識別が不完全な為、検出回路改良。 $ver = 'referer.pl Rev.1.102(作成:鷹の巣)'; #--------------------------------------------------------------------------------- # 1.用途 # #  このPerlスクリプトは、フリーソフトです。詳細は、項4をご一読願います。 # #  このPerlスクリプトは、WebサーバーのAN HTTPDのrefererファイルから、 #  アクセス元URLとアクセス元ホスト名とアクセス先の自サイトのURLと検索キーと #  検索キーに使用された単語を抽出し、出現頻度をファイルとして、生成します。 # #  アクセス解析を行うのに、Microsoft Excelなどの前処理としても使用出来ます。 #  クライアント機で処理することを前提にしている為、アクセス統計処理などの #  サーバーへの負荷を小さく出来ます。 #  (というか、サーバーはrefererログだけ取っていれば良い。) # #  但し、まだ若干の文字化けが検索キーの表示に存在しますので、 #  ご容赦願います。多分、Webサーバーの通信エラーだと考えています。 #  尚、Encode モジュールを使用した場合は、コードの自動識別ができない場合、 #  文字化けが発生することがわかっています。 #   #--------------------------------------------------------------------------------- # 2.作成されるファイルの表示例と特徴 # #  作成されるhtmlファイルの表示例は、以下のURLのリンク先に設置しています。 #  http://sakaguch.com/SetAnhttpdSec.html#referer # #  ○利点:必要な前処理がほとんど終わっているので、Microsoft Excelなどに #      容易に入力して、手間がかからない。 #      クライアント機で処理することを前提にしている為、 #      アクセス統計処理のサーバーへの負荷を小さく出来る。 # #  ○欠点:処理に時間がかかり過ぎる。データだけで、視覚的ではない。 #      集中的に処理を行うので、クライアント機での処理向き。 #      スクリプトの読みやすさに重点を置いているので、処理速度が #      遅い。ループの中で毎回、同じデータを設定していたりします。 # #--------------------------------------------------------------------------------- # 3.ご注意事項 # #  このスクリプトは、Windows 2000 Professional #  Active Perl 5.8.4.810 built for MSWin32-x86-multi-thread #  jcode.pm ver.0.82 の環境にて、動作確認を行っております。 #  UTF-8のコード変換の為、Active Perl 5.6では、jcode.pmのインストールが必要ですから、 #  ご注意願います。詳細は、http://sakaguch.com/SetJcodePm.html をご参照願います。 # #  また、このスクリプトは、Windows 2000 Professional #  ActivePerl-5.8.4.810-MSWin32-x86.msi の環境にても動作確認を行っております。 #  Active Perl 5.8では、UTF-8のコード変換が標準の組み込みモジュールで #  実現できますので、jcode.pmのインストールは不要です。 # #  このスクリプトに対するご質問や不具合がございましたら、電子メールで、 #  webmaster@sakaguch.com まで、お寄せ下さい。 #  また、「鷹の巣」の自宅サーバー掲示板 #  http://sakaguch.com/cgi/bbs/ #  にご投稿して頂いても結構です。 # #--------------------------------------------------------------------------------- # 4.著作権 # #  このスクリプトは、鷹の巣が作成しましたが、著作権は放棄しています。 #  スクリプトの再配布や改造は自由ですが、無償として下さい。 #  いかなる目的であっても、このスクリプトに付加価値をつけて、 #  有償配布してはなりません。 # #--------------------------------------------------------------------------------- # 5.初期設定のログファイルの位置の例 # # D:\www\log\referer.20030101.log (AN HTTPD のリフェラーログファイル) # referer.20030102.log # | # referer.20030131.log # # 上記のログファイルの配置では、$LOGDIR ="D:/www/log"; と設定します。 # #--------------------------------------------------------------------------------- # 6.起動方法 # #  コマンドラインから、perl referer.pl yyyymmを実行します。 #  引数yyyymm には、年月のデータを入れて下さい。 #  2003年1月のログファイルデータでしたら、 #  perl referer.pl 200301 の様に起動します。 #  引数がない場合は、エラー表示を行い、処理を終了します。 # #  AN HTTPDのreferer.yyyymmdd.logファイルのあるディレクトリ(フォルダ)に処理対象の #  ログファイルがない場合は、すぐに終了し、サイズ0のファイルが生成されます。 # #--------------------------------------------------------------------------------- # 7.その他 # #  Active Perlは、5.8 が配布されるようになり、jcode.pm のモジュール機能が標準で、 #  組み込まれました。Active Perl 5.8では、jcode.pmのインストールは、不要です。 #  使用しているActive Perlの種類を「 perl -v 」コマンドで調べて、基本設定の #  エンコードモジュールの設定を行って下さい。 # #--------------------------------------------------------------------------------- #--------------------------- #■□■ 基本設定 ■□■ #--------------------------- # ログファイルのディレクトリ(フォルダ)の設定 $LOGDIR ="D:/www/log"; # 出力ファイルのディレクトリ(フォルダ)の設定 $OUTDIR ="D:/www/log"; # リンク元の処理から除外する文字列(必ず自ドメイン名とプライベートアドレスを入れておくこと。) $OMIT = '(example.com|http://127.0.0.|http://192.168.|.gif|.jpg|.css)'; # エンコードモジュールの設定 # Perl 5.6 以前に jcode.pm を追加インストールした   場合は、未使用($FLAG_ENCODE = 0)を選択のこと。 # Perl 5.8 以降の Encode モジュール(標準モジュール)の場合は、 使用($FLAG_ENCODE = 1)を選択のこと。 $FLAG_ENCODE = 0; #--------------------------- #■□■ 基本設定の終わり ■□■ #--------------------------- # 検索キーを表わす変数を定義する。?q=自宅&p=サーバー&?・・・であれば、qとpを登録すること。 @QUERY = ("aq","as_q","as_oq","config","gqs","jenre","key","kw","MT","name","oq","p","QRY","QueryString","q","qs","qt","qry","qts","query","s","search","searchfor","Text","w"); # デバックモード(1でデバック、0で通常 ?デバックでは、中間ファイルを削除しません。) $DEBUG = 0; # 編集に使用しているコード(euc-jp と shiftjis と 7bit-jis の3種類の内のいずれかを指定) # Windows の場合は、shiftjis をPC-UNIX の場合は、euc-jp を設定します。 $EDIT_CODE = "shiftjis"; #--------------------------- # 設定の終わり #--------------------------- # 主回路 &main; exit; sub main { #--------------------------- # 主回路 #--------------------------- # 処理:月単位のWWWサーバーのrefererログファイル(NCSA形式)より、リンク元のURLとホストと # 検索キーと検索単語と自サイト内リンク先URLの出現頻度表を作成する。 # # 入力:月単位のperlコマンドライン引数$ARGV[0] 例.2003年1月だったら、200301 # 出力:リンク元出力ファイル名(URL単位):$OUTfileFromU # リンク元出力ファイル名(ホスト単位):$OUTfileFromH # 検索キー出力ファイル名(検索単位) :$OUTfileKeyS # 検索キー出力ファイル名(単語単位) :$OUTfileKeyW # 自サイト内リンク先の出力ファイル名 :$OUTfileTo # 日本語コード変換モジュールの使用を宣言。 if ( $FLAG_ENCODE ) { # 日本語コード変換 Encode モジュールの使用を宣言する。(Perl 5.8以降は、標準モジュール) eval 'use Encode qw/ encode decode /;'; eval 'use Encode qw/ from_to /;'; eval 'use Encode::Guess qw/ euc-jp shiftjis 7bit-jis /;'; # eval 'use Encode::JP::H2Z;'; # 検索キー用変換データ表の設定 &set_replace_char; } else { # 日本語コード変換jcode.pmモジュールの使用を宣言する。 eval 'use Jcode;'; } # 改版番号の表示 print "$ver\n\n"; # コマンドライン引数の処理 $argv = $ARGV[0]; if ( !$argv ) { &error ("引数がありません。引数を指定して下さい。\n\n例.perl referer.pl 200301\n"); exit; } # 出力ファイル名の設定と表示 &disp_OutFileName ( $argv ); # ログデータの読み込みと分類 &read_separate ( $argv ); # リンク元URLの頻度表を作成 &make_hindo ( "$OUTDIR/TmpFromU.txt" , "$OUTfileFromU" ); # リンク元ホストの頻度表を作成 &make_hindo ( "$OUTDIR/TmpFromH.txt" , "$OUTfileFromH" ); # 検索キーの抽出と変換 &make_key ( "$OUTDIR/TmpKey.txt" , "$OUTDIR/TmpKeyS.txt" , "$OUTDIR/TmpKeyW.txt" ); # 検索キーの頻度表(検索単位)を作成 &make_hindo ( "$OUTDIR/TmpKeyS.txt" , "$OUTfileKeyS" ); # 検索キーの頻度表(単語単位)を作成 &make_hindo ( "$OUTDIR/TmpKeyW.txt" , "$OUTfileKeyW" ); # 自サイト内リンク先URLの頻度表を作成 &make_hindo ( "$OUTDIR/TmpTo.txt" , "$OUTfileTo" ); # 一時ファイルの消去 if (!$DEBUG) { unlink "$OUTDIR/TmpFromU.txt" , "$OUTDIR/TmpFromH.txt" , "$OUTDIR/TmpKey.txt" , "$OUTDIR/TmpKeyS.txt" , "$OUTDIR/TmpKeyW.txt" , "$OUTDIR/TmpTo.txt" ; } print "\n処理が終了しました。\n\n"; # 改版番号の表示 print "$ver\n"; } sub disp_OutFileName { #--------------------------- # 出力ファイル名の設定と表示 #--------------------------- # 処理:出力ファイル名を設定し表示する。 # # 入力:月単位のperlコマンドライン引数$hikisuu 例.2003年1月だったら、200301 # 出力:リンク元出力ファイル名(URL単位):$OUTfileFromU # リンク元出力ファイル名(ホスト単位):$OUTfileFromH # 検索キー出力ファイル名(検索単位) :$OUTfileKeyS # 検索キー出力ファイル名(単語単位) :$OUTfileKeyW # 自サイト内リンク先の出力ファイル名 :$OUTfileTo my ( $hikisuu )= @_; $hikisuu = "$OUTDIR/$hikisuu"; $OUTfileFromU = "$hikisuu"."RefererFromU.log"; print "リンク元出力ファイル名(URL単位):$OUTfileFromU\n"; $OUTfileFromH = "$hikisuu"."RefererFromH.log"; print "リンク元出力ファイル名(ホスト単位):$OUTfileFromH\n"; $OUTfileKeyS = "$hikisuu"."RefererKeyS.log"; print "検索キー出力ファイル名(検索単位) :$OUTfileKeyS\n"; $OUTfileKeyW = "$hikisuu"."RefererKeyW.log"; print "検索キー出力ファイル名(単語単位) :$OUTfileKeyW\n"; $OUTfileTo = "$hikisuu"."RefererTo.log"; print "自サイト内リンク先の出力ファイル名 :$OUTfileTo\n\n"; } sub read_separate { #--------------------------- # 月単位ログファイルの前処理 #--------------------------- # 処理:月単位のログファイルから、URLと検索キーの分離し、一時ファイルに書き出す。 # # 入力:月単位のperlコマンドライン引数$hikisuu 例.2003年1月だったら、200301 # 出力:TmpFromU.txt:リンク元URL一時ファイル ,TmpFromH.txt:ホスト部分一時ファイル #    TmpKey.txt:検索キー一時ファイル ,TmpTo.txt:リンク先のURL一時ファイル my ( $hikisuu )= @_; open( OUTfromU , ">$OUTDIR/TmpFromU.txt") || &error("Open Error : $OUTDIR/TmpFromU.txt"); open( OUTfromH , ">$OUTDIR/TmpFromH.txt") || &error("Open Error : $OUTDIR/TmpFromH.txt"); open( OUTkey , ">$OUTDIR/TmpKey.txt") || &error("Open Error : $OUTDIR/TmpKey.txt"); open( OUTto , ">$OUTDIR/TmpTo.txt") || &error("Open Error : $OUTDIR/TmpTo.txt"); for ( 1..31 ) { # 引数には、200301の様な月単位の数値が入るので、これを20030101?20030131の日付に変更する。 $Fname = $hikisuu . sprintf("%02d",$_); # ログディレクトリのreferer.20030101.log?referer.20030131.logというファイル名にする。 $INfile = "$LOGDIR/referer.$Fname.log"; # ファイルが存在したら、データを分類する。 if (-e "$INfile") { &separate ( $INfile ); } } close(OUTto); close(OUTkey); close(OUTfromH); close(OUTfromU); } sub separate { #--------------------------- # URLと検索キーの分離 #--------------------------- # 処理:ログファイルから、リンク元URLとホスト部分と検索キーとリンク先のURLに分解し、各々ファイルに書き出す。 # # 入力:ログファイル$filenameIn # 出力:ファイルハンドル?OUTfromU:リンク元URL ,OUTfromH:ホスト部分 ,OUTkey:検索キー ,OUTto:リンク先のURL my ( $filenameIn )= @_; my ( $error_count , $dummy , $ref_data , $type_enc , $type_from , $type_to , $ref_from , $ref_to , $search_key , $host ); # 記録ファイルから読み込み open ( IN , "$filenameIn" ) || &error("Open Error : $filenameIn" ); print "$filenameInを処理中です。\n"; $error_count = 0; while () { # 行末の改行コードを取り除く。 chomp($_); # 自サイトのドメイン名や画像ファイルデータを除去 if ($_ !~ /$OMIT/) { # 日付部分を$dummyに分離して破棄 ($dummy , $ref_data) = split(/http:\/\//, $_ ); # URLデコード $ref_data =~ tr/+/ /; $ref_data =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # タグの処理 $ref_data =~ s/<//g; $ref_data =~ s/&/&/g; $ref_data =~ s/"/"/g; if ( $ref_data ne "" ) { if ( $FLAG_ENCODE ) { # Encode モジュール使用時(Perl 5.8以降) # 変換元のコードを調べる。 $type_enc = guess_encoding ( $ref_data ); # 変換先のコードを設定する。 $type_to = $EDIT_CODE; # 変換元のコードを設定する。 eval { $type_from = $type_enc -> name; }; if ($@) { # 変換元のコードがわからない場合 ######### この部分は、本来は不要。 ######### $type_from = code_fumei ( $ref_data , $type_enc , $type_to ); $error_count++; # $ref_test = $ref_data; from_to ( $ref_test, $type_from , $type_to ); if (( $type_from ne "utf8" && $ref_test =~ tr/\?/\?/ ) > 1 ) { print "$type_from:$type_enc:$ref_test\n"; } } # 変換元のコードから編集に使用しているコードに変換(半角カナを全角カナには、変換しない。) from_to ( $ref_data , $type_from , $type_to ); } else { # jcode モジュール使用時(Perl 5.6以前) # # 文字コードの種類を調べる # Jcode::convert( \$ref_data , $code ); # シフトJISコードに変換(半角カナを全角カナに変換) # Jcode::convert ( \$ref_data , 'sjis' , $code , "z" ); # シフトJISコードに変換(半角カナを全角カナには、変換しない。) $ref_data = jcode ( $ref_data ) -> sjis; } # リンク元とリンク先を分離 ($ref_from , $ref_to) = split ( / -> /, $ref_data ); # リンク元と検索キーを分離 ($ref_from , $search_key) = split ( /\?/ , $ref_from ); if ($ref_from ne "") { # リンク元のURL部分を書き出す print OUTfromU "http://$ref_from\n"; ( $host ) = split ( /\// , $ref_from ); # リンク元のホスト部分を書き出す print OUTfromH "$host\n"; } # 検索キーを書き出す if ($search_key ne "") { print OUTkey "$search_key\n"; } # リンク先のURL部分を書き出す if ($ref_to ne "") { print OUTto "$ref_to\n"; } } } } close(IN); if ( $FLAG_ENCODE ) { print "error count = $error_count\n"; } } sub code_fumei { ######### この部分は、本来は不要。 ######### #--------------------------- # 変換元コードの類推 #--------------------------- # 処理:guess_encoding ( $referer )で、$refererの使用コードを調べて不明な場合、使用コードを類推する。 # # 入力:データファイル$referer , $encode不明なコード , $type_to変換先コード # 出力:使用コード$type # # 不明なコードの場合、$encodeには、"shiftjis or euc-jp or utf8"の様な文字列が入っている。 # my ( $referer , $encode , $type_to ) = @_; # 引数の設定 my ( $type , $ref_test ); ######### この部分は、今後の課題 ######### # 変換元のコードがわからない場合、アクセス元のホスト名を手がかりに # 使用コード$typeを決めていく。 $type = "euc-jp"; # まず、基本的にEUC(拡張UNIXコード)に設定する。 if ( $referer =~ /(search.fresheye.com|www.goo.ne.jp|.infoseek.co.jp|search.naver.co.jp|www.tocc.co.jp)/ ) { ; } elsif ( $referer =~ /(verno.ueda.info.waseda.ac.jp|google.yahoo.co.jp|.odn.ne.jp|search.biglobe.ne.jp)/ ) { ; } elsif ( $referer =~ /(Shift_JIS|excite.co.jp|search.nifty.com|.msn.com|.netscape.com)/ ) { $type = "shiftjis"; } elsif ( $referer =~ /(www.altavista.com|www.excite.co.jp|www.alltheweb.com|.lycos.co.jp)/ ) { $type = "shiftjis"; } elsif ( $referer =~ /cache:/ ) { $type = "utf8"; } elsif ( $referer =~ /.google./ ) { if ($referer =~ / (UTF-8|utf-8) / ) { $type = "utf8"; } else { $type = "shiftjis"; } } else { # アクセス元のホスト名が定義されていない場合 if ( $encode =~ /utf8/ ) { # UTF-8の可能性がある場合は、UTF-8コードにする。 $type = "utf8"; } } if ( $type eq "euc-jp" ) { # EUC(拡張UNIXコード)で変換して見る。 $type = "euc-jp"; $ref_test = $referer; from_to ( $ref_test , $type , $type_to ); # EUC(拡張UNIXコード)で変換した結果、「?」の文字が3つ以上あれば、シフトJISコードに設定する。 if ( ( $ref_test =~ tr/\?/\?/ ) > 2 ) { $type = "shiftjis"; } } # $ref_test = $referer; from_to ( $ref_test, $type , $type_to ); if (( $ref_test =~ tr/\?/\?/ ) > 1 ) { print "$type:$encode:$ref_test\n"; } # $ref_test = $referer; from_to ( $ref_test, $type , $type_to ); print "$type:$encode:$ref_test\n"; return $type; # 戻り値の設定 } sub make_hindo { #--------------------------- # 頻度表の作成 #--------------------------- # 処理:行単位のデータの出現頻度を調べ、出現頻度の多い順に並び替え、頻度表として出力する。 # # 入力:行単位で格納されたデータファイル$filenameIn # 出力:頻度ファイル$filenameOutとして行単位で出力 my ( $filenameIn , $filenameOut )= @_; my ( @new , %count , $count_name , $count_value ); print "$filenameOutの頻度表\を作成中です。\n"; open ( IN , "$filenameIn" ) || &error("Open Error : $filenameIn"); open ( OUT , ">$filenameOut" ) || &error("Open Error : $filenameOut"); while () { # 出現頻度を計数する。 $count{"$_"}++; } while (($count_name, $count_value) = each( %count )) { # 全データを出現頻度として、まとめ書式を整え、配列に格納する。 push ( @new ,sprintf ( "%8d %s" , $count_value , $count_name )); } # 逆順(出現頻度の多い順)で並び替え、頻度表として出力する。 print OUT reverse sort @new; close (OUT); close (IN); } sub make_key { #--------------------------- # 検索キーと検索用語の抽出 #--------------------------- # 処理:アクセス元URLの引数部分から、検索キーと検索に使用された単語をファイルに書き出す。 # # 入力:行単位で格納されたアクセス元URLの引数部分ファイル$filenameIn # 出力:行単位で、検索キー用ファイル$filenameOutSearch と 検索キーの用語ファイル$filenameOutWord を出力 my ( $filenameIn , $filenameOutSearch , $filenameOutWord )= @_; my ( @datablock , $datablock , $utf8 , $from , $to , $count_disp, $name , $value , $flag , @keydata , @new , %count , $count_name , $count_value ); print "$filenameOutSearch と $filenameOutWord の検索キーを作成中です。\n"; open ( IN , "$filenameIn" ) || &error("Open Error : $filenameIn"); open ( OUTSearch , ">$filenameOutSearch" )|| &error("Open Error : $filenameOutSearch"); open ( OUTWord , ">$filenameOutWord" ) || &error("Open Error : $filenameOutWord"); if ( !$FLAG_ENCODE ) { # 変換する文字を指定する。(漢字コードは、EUCコードに指定!!!) $from = '0-9A-Za-zA-Z'; $from = jcode ( $from ) -> euc; $to = '0-9a-za-za-z'; } $count_disp = 0; while ( $line = ) { # 改行コードを取り除く。 chomp( $line ); if ( $line eq "" ) { next; } # & で区切られた引数を分解する。 @datablock = (); @datablock = split( /&/ , $line); # 全ての引数の内、検索キーの文字だけを変換して書き出す。 foreach $datablock (@datablock) { ( $name, $value ) = split( /=/ , $datablock ); # 検索キーかどうかを判断し、検索キーを処理する。 $flag=0; foreach (@QUERY) { if ( $name eq $_ ) { $flag=1; last; } } if ($flag) { # 全角スペースを半角スペースに変換 $value =~ s/ / /g; # +と"を半角スペースに変換。シフトJISコードなので、trの高速置換は、使用できない # 高速置換のtrを使用すると置換が不正になる。$value =~ tr/(+|")/ /; $value =~ s/(\+|\")/ /g; if ( $FLAG_ENCODE ) { # Encode モジュール使用時(Perl 5.8以降) # 検索キー$value をUTF-8 コードに一旦変換し、 # UTF-8 コードコードでの変換データ表%UTF8CHAR_CONVを # 使用して、検索キー$value を変換する。 # 変換後は、元のコード$EDIT_CODE に戻す。 $utf8 = decode ( $EDIT_CODE , $value ); while (( $from , $to ) = each ( %UTF8CHAR_CONV )) { $utf8 =~ s/$from/$to/g; } $value = encode ( $EDIT_CODE , $utf8 ); } else { # jcode モジュール使用時(Perl 5.6以前) # シフトJISコードに変換(半角カナを全角カナに変換し、文字を置換) $value = Jcode -> new($value) -> h2z -> tr( $from , $to ) -> sjis; } @keydata = (); # スペースで分けられた検索キーを書き出す。 if ( $value ne "") { print OUTSearch "$value\n"; } @keydata = split( / / , $value ); foreach (@keydata) { if ( $_ ne "") { print OUTWord "$_\n"; } } } } # 100行処理する度に表示を1回行う。 if (!( $count_disp % 100 )) { $| = 1; # 出力のバッファリングを停止 print "."; $| = 0; # 出力のバッファリングを行う。 } $count_disp++; } print ".\n"; close (OUTWord); close (OUTSearch); close (IN); } sub error { # エラーの内容を表示して終了する。 print "$_[0]\n"; exit; } sub set_replace_char { # 検索キー用変換データ表の設定 my ( $name , $value ); my %char_conv = ( '0','0','1','1','2','2','3','3','4','4','5','5','6','6','7','7','8','8','9','9', 'A','a','B','b','C','c','D','d','E','e','F','f','G','g','H','h','I','i','J','j','K','k','L','l','M','m','N','n','O','o','P','p','Q','q','R','r','S','s','T','t','U','u','V','v','W','w','X','x','Y','y','Z','z', 'a','a','b','b','c','c','d','d','e','e','f','f','g','g','h','h','i','i','j','j','k','k','l','l','m','m','n','n','o','o','p','p','q','q','r','r','s','s','t','t','u','u','v','v','w','w','x','x','y','y','Z','z', 'A','a','B','b','C','c','D','d','E','e','F','f','G','g','H','h','I','i','J','j','K','k','L','l','M','m','N','n','O','o','P','p','Q','q','R','r','S','s','T','t','U','u','V','v','W','w','X','x','Y','y','Z','z', 'ヴ','ヴ','ガ','ガ','ギ','ギ','グ','グ','ゲ','ゲ','ゴ','ゴ','ザ','ザ','ジ','ジ','ズ','ズ','ゼ','ゼ','ゾ','ゾ','ダ','ダ','ヂ','ヂ','ヅ','ヅ','デ','デ','ド','ド','バ','バ','ビ','ビ','ブ','ブ','ベ','ベ','ポ','ボ','パ','パ','ピ','ピ','プ','プ','ペ','ペ','ポ','ポ', 'ー','ー','ア','ア','イ','イ','ウ','ウ','エ','エ','オ','オ','カ','カ','キ','キ','ク','ク','ケ','ケ','コ','コ','サ','サ','シ','シ','ス','ス','セ','セ','ソ','ソ\', 'タ','タ','チ','チ','ツ','ツ','テ','テ','ト','ト','ナ','ナ','ニ','ニ','ヌ','ヌ','ネ','ネ','ノ','ノ','ハ','ハ','ヒ','ヒ','フ','フ','ヘ','ヘ','ホ','ホ', 'マ','マ','ミ','ミ','ム','ム','メ','メ','モ','モ','ヤ','ヤ','ユ','ユ','ヨ','ヨ','ラ','ラ','リ','リ','ル','ル','レ','レ','ロ','ロ', 'ワ','ワ','ヲ','ヲ','ン','ン','ァ','ァ','ィ','ィ','ゥ','ゥ','ェ','ェ','ォ','ォ','ャ','ャ','ュ','ュ', 'ョ','ョ' ); # UTF-8用検索キー用変換データ表の設定 while (( $name , $value ) = each ( %char_conv )) { $UTF8CHAR_CONV { decode ( $EDIT_CODE , $name ) } = decode ( $EDIT_CODE , $value ); } }