フィンローダのあっぱれご意見番

第61回:Perlは強力

初出: C MAGAZINE 1997年5月号
Updated: 1997-08-25

[1つ前] [1つ後] [一覧] [ホームページ]


 私のpcはWindows 95がうまく動いてくれないのだが、とにかく最近はWindows 95 が主流になっているらしい。ソフト売場に行って棚の様子を見てもそうだし、フ ォーラムにアップロードされるフリーソフトの比率を見ると分かる。一応私はフ ォーラム管理者という立場だから、フォーラムに入ってきたソフトを動作確認す ることになっているのだが、動作するマシンがないとちょっと困る。それに、わ が家のpcはフォーラムの保守作業用データなども入っているので、あまり危険な ことはしたくない。動作するマシンがあったとしても、そこで動作確認した途端 にハードディスクが全部破壊された、というのも困るのである。確かに外への被 害を事前に食い止めることはできるかもしれないが、こちらの損害が大き過ぎる。

 というわけで、危険なこと用のスタンドアローンマシンでWindows 95が動くス ペック、という話をリアルタイム会議で出したら、リブレットなら10万円を割っ ているというので、そんならと思って買って来た。実はフロッピードライブ別売 というのがミソだったかもしれないが、ドライブも追加して、8+8MBの16MBメモ リーの状態で、アプリケーションモデルという何やらアプリがインストールされ たタイプのものが、税込み11万円。ちょっと予算オーバーだが、もしかしたら万 一の時の非常用マシンとして使えるかもしれないと思って購入した。ちなみにう まく買えばもっと安くて済むという噂もある。

 最近、雑誌の広告を見ていると、ローエンドのマシンの価格帯がかなり下がっ てきたようである。パソコンショップに出かけたりすると、陳列されているマシ ンは20万〜40万あたりの価格で、これだけ部品が安くなっているのに、PC-8801 が主流だった時代とどうして価格が変わらないのかな、と思ったりする。ところ が、最近はデスクトップでPentium搭載、メモリも16MB以上あってWindows 95イン ストール済み、という感じのマシンが10万円前後で購入できるようだ。これは例 えば家庭からWWWを見るという程度の用途ならかなり十分なスペックなわけで、 もしかすると本格的なホームpc時代が来る前触れなのかもしれない。

 さて、Librettoである。これがWindows 95のウィルス検査用のマシンというの は、実にもったいない話かもしれないが、とりあえず起動してみる。さて、Wind ows95はどこに…と思ったらバックアップは自分で取れと書いてあって、これは まいった。「じゃあ取るか」と思ったのだが…そんな生やさしい話ではない。ま ず、40枚以上のフロッピーを用意する。ってこの時点で「やってられるか!」と 叫んでちゃぶ台をひっくり返す人が大勢いるような気もするが、最近のpc98マシ ンだと200枚以上のフロッピーを用意しろというようなとんでもない機種もある そうだ。一体何考えてるんだか。CD-ROMを一枚付ければ済む話だと思うのだが、 でも考えてみればLibrettoにCD-ROMが付いてきてもドライブがオプションなんだ から話にならないのか。ともかく、なにしろこれから危険なことをするという想 定で買ったマシンだから、バックアップするしかない。ちゃんとバックアップフ ロッピー用のラベルが付いてくるのせめてものが親切である。ちなみに、パンフ レットをよく読んだら、別売でCD-ROMもあるそうだ。

 しかしキーボードの狭さは、やはり衝撃的だった。最近、FPROGでは毎週100発 言以上しているので、タッチタイプの速度は重要なポイントだ。TP230Cs、TP220 ときて、Librettoあたりが限界だと思った。これが将来出てくるWindowsCEマシ ンとなると、どうやればタッチタイプできるかよく分からないが、これだけ狭い と片手で全部のキーに指が届きそうである。既存の配列にこだわらず、最初から 片手を想定したキー配置も面白いかもしれないが、まだそのような特殊なキー配 置のPDAはなさそうだ。

*

 いきなりだが、Perlの話である。今までawkばかり使っていたのだが、Perlは いいのか悪いのか分からないがとにかく使っているというような話を大昔にFPL のきださんに聞いたので、機会があれば使おうかなと思ったわけだが、Web page でCGIを触りはじめると、Perlを使ったサンプルだらけなので、こりゃ使うしか ないかな、と思っていきなりである。まず最初、awkのように1行ずつ読んで処理 して、…という基本的なことをさせようとするのだが、標準入力からどうやって 読むかというのが分からない。

 やはり入門書から読むしかないということで、ソフトバンクから出ているPerl という本を買ってきた。別にPerlの記事を書くわけでもないので、こういうのは 自分で買うのである。自腹切って買ったのだからヨイショする必要もないので率 直に感想を書きたいわけだが、取り立てて何も書くことがない。リファレンスマ ニュアルが別冊になっているのがありがたい、という感じ。

 そこで早速いろいろプログラムを作って実行している。一応私はフォーラム管 理者という立場だから、それなりの処理を毎日実行しているのだが、それをPerl +魔王(通信ソフト)に置き換えようというのである。今まではPerlではなくawkを 使っていたのだが、これは別にどちらでも似たようなものだ。もっとも、Perlの 方がちょっと強力、という感じは確かにある。

 List 1は、Perlで書いたログ整理のスクリプトである。「魔王」は少し行儀が 悪くて、作成するログの前後にゴミが入ってしまう。例えばNIFTY-Serveのプロ ンプトだとか、ログアウトの時のメッセージなどである。これらを取り除くのが 目的だ。このコマンドを実行する時には、

go32 \home\perl\jperl -i.bak c:\home\perl\cleanup.pl %1

のようなバッチファイルを作ってある。go32から起動しているのだが、これはも しかするとうまい方法があるのだろうか? 何か最近「とにかく動けばok」とい う感覚で処理してしまうことが多くなってよくない。jperlには、exe形式のその ままDOSで実行できるものもあるが、どうもメモリ不足になってうまく動いてく れないことがあるので、このようにgo32から起動しているのだ。これを動かすの もちょっとトラブルがあって、最初そのまま起動しようとするとfloating point がどうこうというエラーが出て動かなかったのである。幸い、このトラブルは「 ネットやろうぜ」のnewsgroupで見た記憶があったので、過去のログを探してみ たら、

set GO32=emu c:\bin\emu387

のように環境を設定して、emu387というプログラムを使いなさい、というアドバ イスがあった。私の使っているマシンはTP230Csで、これは486SX/33MHzというス ペックなので、浮動小数点の演算はできないわけだ。

で、この環境を設定しようとして、autoexec.batの最後に、

set GO32=emu c:\bin\emu387

と追加したのだが、この環境がうまく設定されないのである。この次の行には

cd \tmp

と書いてあるのだが、これが実行されないのだ。不思議な話だが、

set GO32=emu c:\bin\emu387 (この間スペース54個) cd \tmp

が実行されてしまうのである。これには悩んだわけだが、結局どうにもならなく て、最終的にはsetの行をあちこち入れ替えるなどして、原因不明のまま強制解 決したという状況なのである。

 さて、これでPerlは起動できる状態になったので、List 1のスクリプトを実行 してみたわけだが、小さいログファイルだと、とりあえずうまく動作している。 少し大きいログを処理してみた。途中まで変換した所で終了してしまう。なぜだ ろう? ログを調べてみると、コントロールZが入っているのだ。NIFTY-Serveで はこういうことがたまにある。最初に^Zを削除してからPerlをかけてもいいのだ が、何かやり方があるだろうと思って調べたら、binmodeという処理があった。 バイナリモードとして処理を行うらしい。ところで、これをSTDINに対して実行 してみると、期待に反して結果は全く同じなのである。

 不思議だと思いつつ、試しにファイル名を明示的に指定するようにスクリプト を書替えてみた。追加したのはList 2である。selectで入出力を変更できるとい うのはPerlの便利な処理の一つのようだ。さて、試しにtempというファイルを作 って、途中に^Zを混入させて処理してみた。だいたいうまく行くようだ。細かい 話としては、行末のコード処理がちょっと変化があったのだが、それは今回はパ スする。

 で、今度は大きなファイルである。fc.tmpという1MB程度のファイルを処理し てみた。ところが、出来たファイルは4KBしかない? つまり、fc.tmp.bakという ファイルを作成し、fc.tmpに結果を上書きしようとしたらしいのである。自分自 身を読みながら書いてしまったので、直ぐに終了してしまったらしい。結局これ で1MBのデータが消滅してしまった。こういう時に限ってバックアップが見つか らない、というわけで、テストする時にはコピーを作ってから実行すべし、とい うありふれた教訓である。

---- List 1 ----

#! /bin/perl
#go32 \home\perl\jperl -i.bak c:\home\perl\cleanup.pl %1

while (<>) {
  if (/^(- [A-Z0-9]+ +MES\( *\d+\):.+) \d+\/\d+\/\d+ -$/) {
    if ($header ne $1) {
      print;
      $header = $1;
    }
    $flg = 1;
    next;
  }

  if (/^- MES\(\ *d+\):.+ \d+\/\d+\/\d+ -$/) {
    print;
    $flg = 1;
    next;
  }

  if (/^[0-9]+\/[0-9]+ +[A-Z*][A-Z*][A-Z*][0-9*][0-9*][0-9*][0-9*][0-9*]/) {
    print;
    $flg = 1;
    next;
  }

  if (/^ \010$/) {
    print;
    $flg = 0;
    next;
  }

  if ($flg != 0) {
    print;
  }
}

---- List 1 end ----

---- List 2 ----

  if ($ARGV ne $oldargv) {
    rename($ARGV, $ARGV . '.bak');
    open(ARGVOUT, ">$ARGV");
    select(ARGVOUT);
    $oldargv = $ARGV;
  }

---- List 2 end ----


(C) 1997 Phinloda, All rights reserved
無断でこのページへのリンクを貼ることを承諾します。問い合わせは不要です。
内容は予告なく変更することがあります。