猫に真珠(Perl)

−−−青空文庫のためのMacPerl超入門−−−

by Blue Sky Collection
Created 2001.01.07 Updated 2001.01.07



最初の一歩 ―ともあれ動かしてみよう―

 MacユーザがPerlを使おうとするとき、最初に突き当たる難関は「MacPerlに関する情報が少ない」ということではないでしょうか。世の中にはうんざりするほどPerlの入門書があるのに、そのほとんどがUNIXまたはWindowsのユーザを対象としたものです。

 PerlはもともとUNIXで使われていた言語ですから、UNIXと互換性のあるWindowsへの移植は楽ですし、説明もほとんど共通で問題ありません。しかし、MacPerlについて説明する場合、Mac独自の拡張部分について触れないわけにはいかないため、MacPerlの入門書はMacユーザのみを対象とせざるを得ません。そういった事情で、MacPerl関連の情報は少ないのが実状なのでしょう。

 とはいえ、複雑なことをしなければ、簡単な知識だけで、MacでもPerlを使えるようになります。早速、テキスト処理の醍醐味を味わってみましょう。
 Perlの基本的な文法(ファイルの扱い方や繰り返しの制御、正規表現など)は、Macでも他のOSと同じですので、その部分に関しては、市販の文法書等を参照してください。ここでは、MacPerlの簡単な使い方のみを紹介します。

 Mac用の情報が少ない中、市川せうぞーさんの『まかせて! MacPerl』はオススメ。Mac雑誌の連載をPDF化したものが掲載されていて、DTP用の文字列処理にMacPerlを利用するためのノウハウに的を絞って書かれています。まさに青空文庫向けと言えそうですから、ぜひダウンロードしておきましょう。

(1) インストールする

 Mac用のPerlには、英語版のMacPerlと日本語版のMacJPerlがあります。
 青空文庫周辺でPerlを使用する場合、「日本語で文字列を処理する」ことがほとんどだと思われますので、迷わずMacJPerlをインストールすることをおすすめします。

 市川せうぞーさんの『まかせて! MacPerl』には、インストール後、編集メニューから「編集様式」を選び、フォントを変更しておくべし、と書かれています。青空MacPerlユーザで、KandataやHabianをお持ちの方は、もちろんKandataかHabianを指定しましょう。

 これでPerlを使う準備が整いました。

(2) スクリプトを実行するには

 スクリプトを実行する方法は、大きく分けて次の2つがあります。

  ・MacPerlを起動し、メニューから実行する
  ・ドロップレットというMac特有の形式でスクリプトを保存し、単独で実行する

 メニューから実行する方法の場合、スクリプトにパラメータを渡すことができません。従って、入力ファイルや出力ファイルなどの情報は、全てスクリプトの中に書き込んでおく必要があります。
 ドロップレットにしておけば、実行時点で入力ファイルを指定できますので、あらかじめ指定する必要がありません。この際、Macユーザの特権を大いに活用することをおすすめします。

(3) ドロップレットを作ってみる

 では早速、大野裕さんの「プロ文工作員のための道具箱」から、replace.plをダウンロードして使ってみましょう。
 ただし、ダウンロードしたファイルは、改行コードがCR+LFになっていますので、このままでは使えません。MacPerlで実行したときにエラーになってしまいます。まずは下準備としてLFを取り除いてやることが必要です。
 ここで、Jeditなどのエディタで改行コードを変換しても、もちろんかまわないのですが、せっかくですから、改行コードもPerlで変換するのがMacPerl使いの第一歩ですね。

 先ほど紹介した市川せうぞーさんの連載には、「改行コードを変換してWindowsユーザを見返してやろう」(笑)というスクリプトが紹介されています。ここでは、PDF版の12ページで紹介されているスクリプトを使います。

 MacPerlを起動し、メニューから「ファイル」→「新規」を選ぶと、スクリプトを入力できる画面が開きます。
 ここに、次のとおり打ち込みます。とりあえず、whileを左端から打ち、{}内は適当にインデントしてください。おおまかに言えば「入力ファイル名の後ろに.newを付けた名前の出力ファイルを上書きモードでオープンし、入力ファイルを1行ずつ読んで、読んだ行で最初に見つかったLFを削除し、出力ファイルに1行書き込む」という内容のスクリプトです。詳しい意味は、市販の文法書または『まかせて! MacPerl』で確認してくださいね。

  while(<>){
    open(OUTPUT,">$ARGV.new") unless -e "$ARGV.new";
    s/^\r//;
    print OUTPUT;
  }
  close OUTPUT;


 打ち終わったら、メニューから「ファイル」→「別名で保存」を選び、適当な名前で保存します。ここではlfcutterという名前にしておきましょう。
 保存画面の下のほうに「タイプ」という項目がありますので、ここで「Droplet」を選び、「保存」ボタンを押します。



 「Droplet」は、ワープロやエディタなどの一般のソフトと同じ「アプリケーション」です。従って、ここにファイルをドラッグ&ドロップすると、そのファイルに対する処理が行われます。lfcutterの場合は、「ドロップしたファイルからLFを削除し、元のファイル名の末尾に.newを付けた名前で保存する」という処理が行われることになります。

 作成したlfcutterのドロップレットに、ダウンロードしてきたreplace.plをドロップしてみましょう。replace.pl.newというファイルができましたね。このファイルはLFが取り除かれていますので、MacPerlで実行することができます。エディタなどで開いて、確認してみてください。

(4) 他OS用のスクリプトを、ドロップレットに改造する

 次に、replace.pl.newを、MacPerlで開きます。こんどは、このスクリプトを、ドロップレット形式で使えるように改造しましょう。
 改造が必要なのは、ファイルの入出力に関する部分です。オリジナルでは、次のようになっています。



 オリジナルでは、入力ファイルと出力ファイルを2つのパラメータ(引数とも呼びます)で指定するようになっています。1つ目のパラメータは$ARGV[0]に、2つ目は$ARGV[1]に格納されてスクリプトに渡されます。スクリプトでは、パラメータは$ARGV[n]という形式で表します。nは何番目のパラメータであるかを示しています。詳しく言えば、パラメータはARGVという名前の配列に格納されていて、nで配列の何番目の要素であるかを指定しているのです。Perlでは配列の要素は0番目から始まりますので、パラメータが2つあるときには、0番目と1番目に入っていることになります。

 では、この部分を改造しましょう。
 Dropletでは、入力用のファイルはドロップすることで指定します。MacPerlが、ドロップされたファイルを標準入力としてオープンしてくれるのです。従って、入力ファイルを明示的にオープンする必要はありません。
 オリジナルではコマンドラインで出力ファイルの名前を指定するようになっていますが、ドロップレットでは名前を渡す方法がありませんので、lfcutterと同じように、入力ファイル名の末尾に文字列を付加して、自動的に名前を付けるようにします。
 この改造が終わった状態は、次のようになります。



 入力ファイルをオープンする記述がなくなり、出力ファイルをオープンする記述が、while文の{}の中に入っています。さらに、出力ファイルオープンの記述の後に、unless -e "$ARGV.rep"というおまじないが付いています。

 while文の中に出力ファイルのオープンが入っているのは不思議な気がしますが、lfcutterと同様、入力ファイル名を元にしてファイル名を付けるため、入力ファイル名を取り込んだ後でオープンする必要があるからです。もし固定のファイル名を使うのであれば、while文の外に出してもかまいません。

 オープンの記述の後にあるおまじないは、「オープンできる状態であればオープンする」という意味です。なぜおまじないが必要になるのかというと、ファイルオープンをwhile文の中に入れたからです。while文の中にあるということは、入力ファイルを1行読み込むたびにオープン命令を実行しているということになります。このおまじないを付けておけば、既にオープンされている状態のファイルをオープンすることはありません。おまじないを付けないと、既にオープンされているファイルを1行毎に上書きモードでオープンしなおすことになり、最終的に、ファイルの中には最後の行のみ残ることになってしまいます。
 ">$ARGV.new"の最初の>を>>に変更すれば、書き込みモードが「上書き」から「追加」になりますので、ファイルが存在しない場合には、おまじないと同じ結果になります。しかし、もし同じ名前のファイルが既に存在していた場合には、そのファイルの末尾に追加することになり、思った通りの結果を得ることができません。(ちなみに、open命令では、指定された名前のファイルが既にあればそれを開き、なければ新たに作成してくれます。)
 ついでに、ファイルをクローズする命令も付けて、書き換えは終わりです。

 書き換えが終わったら、ドロップレットとして保存し、適当なテキストファイルをドロップしてみましょう。.repが付加された名前のファイルができましたね。中身をエディタなどで確認してみてください。
 パラメータとして、入力ファイルと最終的な出力ファイルがそれぞれ1つずつあるスクリプトは、ほぼこれと同じパターンで改造できます。同じく大野裕さんのページからダウンロードできるtxt2tt.plも、同じように改造してみましょう。

 一度保存したドロップレットを、再度編集したいときは、MacPerlのメニューで「ファイル」→「開く」を選んで開きます。optionキーを押しながらダブルクリックする方法もありますが、間違って起動してしまうことがありますので、メニューから開く方法をおすすめします。間違って起動してしまったら、あわてずに「ファイル」→「スクリプトの停止」で終了させてください。

 lfcutter、replaceともに、変換後のファイルは、ドロップしたファイルと同じフォルダにできていることに気づかれたと思います。これは、ファイルをドロップしたとき、MacPerlがフルパス名でファイルを認識しているからです。
 UNIXやWindowsでは、入力ファイル、出力ファイルの場所を明確に指定する必要があるのに比べ、このあたりはドロップレットの便利なところといえるでしょう。





 → トップページへ

不明点がありましたら、 info@aozora.gr.jp までご連絡下さい。