日本語Perl |
一般に、プログラミング言語といえば、「これをするなら、こうするのがこの言語でのやり方です。」という方法を貫いている。融通性がないといえばそれまでだが、その方法だけを覚えれば済むので、かえって気が楽になるともいえる。その一方で、Perl では、「それをやる方法は1通り以上ある」といっているだけあって、同じことをするプログラムが人によって様々なやり方で書かれている。各作者の作法に従って、その人なりの表現方法が許されることは、その人にとっては良いことといえる。しかし、他の人がそのプログラムを見たときに、すぐに理解できない欠点もある。また、初心者が自分なりに実現した方法が最適といえるのか、初めの頃には判断が難しいことになるということにもつながる。
それを念頭に、「Active Perl V5.8.8」での日本語プログラミング法の概略と実行法を紹介しよう。
まず、ここで述べる「Active Perl V5.8.8」のプログラムには、よその Perl の解説でよく見かける Shebang 構文とよばれている「#!/usr/local/bin/perl」 のような記述が見当たらない。この構文はもともと、OS が UNIX のシステムで、Perl のプログラムを実行するための Perl インタープリタのありかを示すための記述である 。しかし、ここで紹介している「Active Perl V5.8.8」の OS は Windows であり、このため、プログラムを探すパスを指定しておけば、Windows が Perl を自動的に探し出してくれる 。しかも「Active Perl」の場合、そのインストール時にこのパスを勝手に追加指定してくれる。したがって、プログラムの中で指定する必要がないのである。むろん、CGI 等のプログラムで、最終的に UNIX システムへ移植することが前提になっているのであれば、Shebang 構文を書き入れておいても差し支えない。Windows 版 Perl はこれをコメント文として読み飛ばしてくれる。
use utf8;↓ binmode STDIN, ":encoding(cp932)";↓ binmode STDOUT, ":encoding(cp932)";↓ |
今回、 Shebang 構文より重要なのは、『はじめに』でも述べたように、左の3行のコードをプログラムの先頭に書き入れておくことである。この内容を厳密に説明するには、まだ Perl に関する知識が不十分であるので、とりあえず 「Active Perl V5.8.8」に日本語を適格に扱わせるための魔法の呪文と考えていただきたい。
すでに Perl の心得のある人のために概略を説明すると、次のようになる。
第1行目の「use utf8;」はプラグマ(pragma) といって、Perl の動作全体に「(コンパイル)実践上の指示」を与えるもので、ここではプログラムのソースコードが「UTF-8」形式の Unicode で書かれていることを示している。 「Programming Perl (Third Edition)」によれば、Version 5.6 以降の Perl では、内部処理を「UTF-8」 形式の Unicode で 行っており、日本語(実際には世界各国の言語)を正しく認識して扱えるようになっているという。そこで、プログラムも「UTF-8」で書いておけば、その中に含まれる日本語データは何の変換も必要なしに、そのまま処理出来ることになり、Perl が本来もっている機能を存分に使いこなせるようになる。将来的には「use utf8;」を指定しなくても良くなるようだが、現在のところはまだ明示的に指定しておく必要があるという。ただし、「Active Perl V5.8.8」で は、プログラムは「UTF-8」で書かなければならないのだが、内部処理は「UTF-16」で行っているようだ。
「use utf8;」を指定し、プログラムを「UTF-8」の文字コードで書くことで、Perl はプログラムの中に書かれている日本語を、何の変換もせずにそのまま利用でき、Perl のすべての機能を、余すことなく利用できるとはいえ、これによって別の問題が生じる。それは Windows が取り扱っている通常の文字コードは「シフトJISコード」であり、UNIX の場合は「EUC」であって、どちらも一般には「UTF-8」を扱えないことだ。Windows のキーボードが出力するのは「シフトJISコード」であるし、ディスプレーが表示できる文字コードも「シフトJISコード」である。したがって、Perl が、外部の世界とデータを交換する場合、たとえばキーボードからのデータを Perl に渡す場合、あるいは Perl の処理結果をディスプレーに渡す場合、 「UTF-8」のままデータ交換をすると、意味の分からない文字化けの原因となってしまう。
これを解決するために指定しているのが、2〜3行目である。2行目は PC のSTDIN(標準入力装置:通常はキーボード)が 「シフトJIS」の装置であることを Perl に教えており、3行目は PC のSTDOUT(標準出力装置:通常はディスプレー) がシフトJIS の装置であることを教えている。これによって、Perl がこれらの装置と日本語のデータをやり取りする時には、「UTF-8」と「シフトJIS」間のコード変換をしてくれるようになる。
この他にも、STDERR(標準エラー出力装置:通常はディスプレー)に対しても同じ指定をしなければならないのだが、「Active Perl Active Perl V 5.8.8」 の「online document」によると、STDERRに対する指定はできないとなっている したがって、これだけは指定しないのだが、こうすると当然漢字が文字化けするので、エラー時に表示させようとするメッセージは半角英文字コードで書いておくほうがよい。
また Perl で「シフトJIS」を指定する場合のキーワードは「shiftjis」である。しかし、上の記述で「シフトJIS」といいながら、実際の指定は「cp932」になっている。Perl で日本語を正しく扱うには、この理由の背景も知っておいた方がよい。
最近では「シフトJIS」という文字コードの名前は、日本の規格「JIS X 0208:1997」(国際規格としては「ISO-2022-JP」)で規定されている文字コードに対して使われるようになっているようだ。しかし、本来の「シフトJIS」は、マイクロソフトが Windows で日本語を扱えるようにするために採用した文字コードを指していた。日本の規格は後追いの形で、マイクロソフトのコードをもとに作られたのだが、その後微妙な違いが生じ、現在では完全には一致していない。マイクロソフトが使用している「シフトJIS」コードは、マイクロソフトの「Widows Code Page 932 (CP932)」で規定されているものである。巷ではこの両者が混同されて「シフトJIS」とよばれているが、Windows 上のPerl で日本語を適切に扱うためには、両者を厳密に区別しなければならず、Perl ではこれを明確に指定するためのキーワードとして「cp932」を使用している。この「cp932」を「shiftjis」とすると、500文字程度の漢字、記号等で文字化けが生じることになる。これが、Perl 5.8 を使用しながら、文字化けに悩まされ、あたかも Perl 5.8 以上でも日本語を扱うのに苦労しているようなウェブサイトが蔓延している理由のようだ。
さて、それではとりあえず、Perl で動作するプログラムを作ってみよう。左のプログラムをテキストエディタで入力し、「UTF-8」の文字コードで、ファイル名をたとえば「練習1.pl」などとして、所定のフォルダに保存しよう。このファイル名で注意すべき点は、「.pl」は必ず「半角英文字記号」であることである。これより左側 のファイル名の部分は、全角漢字、全角平かな、全角片カナ、全角英数字、半角英数字のどれでも、またこれらの混じったものでも構わない。しかし半角片カナを使用してはならない。 | |
左の図1は上のプログラムを Tera Pad に打ち込み、「D:\PERL」というフォルダに「練習1.pl」として保存し た様子を示している。 | |
このプログラムを実行するには、図2のように「コマンドプロンプト」を起動し、コマンドプロンプトのウィンドウにプログラムファイルのアイコンをドラッグ・アンド・ドロップすればよい。 | |
コマンドプロンプトのウィンドウにプログラムファイルのアイコンをドラッグ・アンド・ドロップすると、図3のように、コマンドプロンプトのコマンドラインに「D:\PERL\練習1.pl」のパスとファイル名が現れる(赤線部)。アイコンをドラッグ・アンド・ドロップする代わりに、当然、キーボードから文字を打ち込んでも実行できる。キーボードから打ち込む場合は、打ち込む前のコマンドラインにすでに「D:\PERL>」と表示されているなら (これをカレントパスのプロンプト表示という)、実際に打ち込むのは、アイコンをドラッグ・アンド・ドロップした際に現れた「D:\PERL\練習1.pl」でなく「練習1.pl」のファイル名だけで良い。プロンプトにすでに表示 されているパスと重複する部分は省略してよい。 | |
これで、コマンドプロンプト・ウィンドウをクリックしてアクティブにすると、カーソル(赤丸部)が現れる。この状態で、キーボードから「Enterキー」を叩けば、図4のように、画面に「日本語Perlの世界にようこそ!」の文字が現れるだろう。 もし、プログラムに何か手落ちがあって、うまく実行されない場合は、プログラムファイルをテキストエディタで修正して、同じ名前で上書き保存すればよい。 これを再び実行するには、今度はプログラムファイルのプログラムファイルのアイコンをドラッグ・アンド・ドロップする必要はない。コマンドプロンプトのウィンドウをクリックして選択し、「↑」キーを叩くとコマンドプロンプトのコマンドラインに「D:\PERL\練習1.pl」のパスとファイル名が再登場する。コマンドプロンプトは、前に実行したことを履歴として覚えているのだ。 |
さて、ここで Perl に実行させたプログラムは、一番簡単なものである。ここで使用した「print」というキーワードは、Perl に対し後に続くデータを標準出力装置に出力(印字)せよ、と命令するものである。、この場合のデータは「日本語Perlの世界にようこそ!」という 文字を「"」で挟んだものでこれを文字列データという。
このプログラムを実行すると、ディスプレー上に指定の文字列が現れる。
結果は、そっけもないほど簡単なものである。しかし、最初の3行、
use utf8;
binmode STDIN, ":encoding(cp932)";
binmode STDOUT, ":encoding(cp932)";
のうち、少なくとも「use utf8;」、「binmode STDOUT, ":encoding(cp932)";」のどちらかを削除すると、文字がまともに表示されなくなる。したがって、この2行(実際には 3行すべて)が重要な働きをしていることに気付くだろう。