11

データ形式の変換

プログラム例およびデータ

MacJPerl五を使った複数ファイルの処理(p. 225)

次のようなプログラムでできる ― pubdic-convert-mac9.pl

@gDictFiles =などの表現や,foreachなどの構文は次の章(第12章)で説明してある。

ただし,データもMac OS 9用の形式(シフトJISコードで改行文字がMac用の文字)になっている必要がある。変換は結構面倒なので,データをMac用に変換したものを chap11-mac9.sit に置いておいたので,これをダウンロードして,展開し,chap11-mac9 というフォルダの下にできるファイルを利用して欲しい。pubdic-convert-mac9.plをMac Perl五から読み込んで実行すればこれらのファイルを読み込んで変換するはずだ([スクリプト]メニューの[選んで実行]でpubdic-convert-mac9.plを選択すればよい)。実行すると,yomidata-big.txtというファイルが出きているはずである。

Mac OS X(およびその他のOS)の改行文字について(p. 225)

pubdic-convert.plの説明でも少し触れたが,テキストファイルの「改行コード」(改行を表す文字の文字コード)はOSによって異なっている。

文字コード「10」の文字を"\n"とかLF,文字コード「13」の文字を"\r"とかCR表すことがある。この表記を使うと,Windowsの改行は"\n\r"(あるいはLFCR)の連続,Unixの改行は"\n"(LF),Mac OSの改行は"\r"(CR)となる。

メモ

本文にも書いたが「\」は環境によって「\」(バックスラッシュ)のように表示される場合や,「¥」(円記号)のように表示される場合がある。どちらの場合も働きは同じだ(説明の都合上全角文字で書いたが,プログラムをするときに使う文字は半角文字 ― 仮名漢字変換をオフにして入力する文字 ― だ)。

厄介なのは,perlの"\n"は「その環境(OS)における改行文字」を表すことだ。つまり,

print "\n";
を実行すると, 次のようになる。

同様のことは,ファイルハンドル<>などを使った読み込みの際にも当てはまる。たとえば,Unixで作ったファイルをMac OS 9の MacPerl五 で読み込もうとすると,Unixで改行に使われているコード10の文字は改行としては扱われないため,改行文字がひとつもないものとして解釈されて(全部のデータが1行で書かれているように解釈されて)処理されることになるわけだ。試しに,MacPerl五で, pubdic-convert-mac9.pl を使ってUnix用の辞書ファイル(bio.uchimei.ucomputer.u,...)を読み込んでみると,おそらくメモリが足りなくなって異常終了してしまうはずだ。このようにならないよう,データファイルの改行文字の変換も必要になるというわけである。

実は,データファイルを変更せずに済ませる方法はある。それは次の文をプログラムの先頭にいれることだ。

$/ = pack("C", hex("A"));

これにより,入力データの改行文字(行の区切り)をコード10の文字に変更できる。packhexについては,本文p. 261を参照して欲しい。まったく同じ使い方だ。$/はPerlに用意されている特別な変数(特殊変数。$_も特殊変数のひとつだ)で,入力データの行の区切りを設定できる変数だ。Perlでは,こういったケースにもきちんと対策がたてられているのだ。やっぱりたいした言語だ。 ちなみに,次のようにすれば,入力を区切る文字を出力できる。

print "$/";

Perlに関するの動向(p. 227)

2002年の夏頃に新しいバージョン5.8がリリースされる予定だ。このバージョンでは,日本語など複数バイトを使う文字の処理が改良され,どのような漢字コードを使っていても,正規表現などに漢字などの2バイト文字が使えるようになるようだ。2002年6月6日現在,RC1 (release candidate 1,正式公開前の開発者用チェック用のバージョン)が公開されている。このバージョンが正式に公開(リリース,release)され一般に広まると,日本語処理はすごくやりやすくなる。ただし,多くの人はプロバイダが提供する環境を使っているので,プロバイダが使えるようにしてくれるのを待たねばならない。 http://www.dan.co.jp/~dankogai/bleedperl/00README.jp.utf8.html に,少し難しいかもしれないが,解説がある。