素歩人徒然 プログラミングの楽しみ Perlと数独の相性 Perl 数独
素歩人徒然
(99)

プログラミングの楽しみ


── Perlと数独の相性

 プログラム作りはなぜ苦しいのか? そして同時に、プログラム作りはなぜ楽しいのか? この相矛盾するような感想を抱えながら私はコンピュータ業界でソフトウェア開発の仕事に携わってきた。そしてその仕事から引退した今、ただ“楽しみのため”にだけプログラミングをするという特権を手に入れたのである。

 今まで色々なプログラム言語(*1)に出会い それらを使ってきたが、“Perl”というプログラム言語に出会えたのは この上なく幸運なことだったと思う。
  【注】(*1)たとえば、機械言語, アセンブラ言語, Fortran II,
      Basic, Fortran IV, ALGOL, COBOL, Pascal, Lisp, Logo,
      PL/I, APL, C, Ada, C++, TeX, Perl, Java, JavaScript,
      VBA, ....
(他にも いろいろあったなぁ…)

 Perlという言語は、主に文字列を処理するのに向いている言語で、いわゆるスクリプト言語に属するものである。適当に書いておけば、処理系の方でうまく判断してくれて、しかも即実行してくれる(*2)類いのものである。他のプログラム言語のように何から何まで詳細に記述しなくても、ただ「良きに計らえ」と任せておけば適当にやってくれるのだから、私の様な無精者には最適である。しかも、吃驚するくらい高速なのだ。これがあるからこそ、引退後もプログラミングを楽しむことができるのである。
  【注】(*2)コンパイラ型ではなくインタープリタ型である。

 プログラミングという作業が楽しいのは、創作意欲を刺激してくれるからであろう。自分の発想した物を、それこそゼロから立ち上げて自ら作り上げることができる。それが思い通りに動作した時の感動! しかも、それを実現させるのに特別な道具立てはいらない。これほど面白い物はないのではないか。Perlでのプログラミングでは、記述方法にも創意工夫が発揮できるから尚更のこと楽しいのである。

 Perlに初めて出会ったのはUnix環境下であったが、パソコン環境でも使えるようになってからは私も本格的に使うようになった。文字列処理を目的として開発された歴史的に古い言語であるが、インターネットの発展とともにウエッブソフトの開発に有用であることが明らかとなり、改めて注目されるようになった。オブジェクト指向の機能を取り入れた版(Versin 5)がリリースされてからは、一層利用価値が増したように思われる。

 大学でプログラミング関係の授業を担当していた時、どんなテーマでもよいから好きにやって構わないという条件で更に1コマ任されたことがあった。そこで私は、迷わずPerlを選んだのである。それまでは部分的に機能を覚えてはそれを使っていただけだったが、学生に教えるとなるといい加減な理解では済ませられない。そこで全体を勉強し直し、同時にその過程で例題を沢山取り入れたテキストを作成した。それを授業で使う教科書として長年用いてきたのである。

 今では、その時作ったテキストを自分自身で参照しては「なるほど、なるほど、そうなのか…」と各種の機能の使い方を思い出してはプログラミングしている始末である。年齢による記憶力の衰えから、細かい文法規則をなかなか覚えられなくて直ぐ忘れてしまうからである。

 それでは、Perlをどんな問題解決に使っているのか少し紹介してみることにしよう。

 たとえば、学生に毎週課題を出してその結果をメールで提出させる。受け取ったら一覧に登録し、ウエッブ上に提出状況を表示して学生が確認できるようにする、という事例(以前「日曜プログラマ」でも紹介した)を取り上げることにしよう。手順としては次のような“ちょっとした仕事”の連鎖となるであろう。

(1)メーラーを立ち上げ、
 ・メールを受信する
 ・課題番号と学籍番号を確認する
 ・目視による内容の確認(評価はまだしない)

・課題番号ごとに学籍番号を集め、
 表計算ソフトに登録するためのデータを作る

(2)表計算ソフトを立ち上げ、
 ・データを取り込む
 ・受講申請済みの学生であることを確認
 ・データを一覧表に登録する
 ・締切日の確認等

・ウエッブ上に表示するための提出状況の一覧データを作る

(3)FTPソフトを立ち上げ
 ・提出状況の一覧データをアップする

・ブラウザを立ち上げ、
 ・提出状況の一覧を目視でチェック

 これらの“ちょっとした仕事”は、どれを取っても難しいことは何もなく誰でも簡単にできることばかりである。しかし個々に、注意深く、そして何回も繰り返し行わなければならない。締切日などは、1日に4〜5回は繰り返すことになる。実はそれが一番問題なのである。“何回も”そして“注意深く”という点が(私に限らず)人間 誰でもなかなか実行できない。すぐ飽きてしまって、その上ミスを起こしやすい仕事なのだ。特に私のような怠けものには向いていない。

 ここで、(1)メーラー (2)表計算ソフト (3)FTPソフトの三つのソフトの実行だけは避けられないが、それ以外のところはPerlでプログラム化し省力化することができる。

 (1)メーラーと(2)表計算ソフトの間の「受信登録」の作業は各課題番号を指定してPerlプログラムで実行させることができる。これにより、メーラー上での特別な作業は大部分不要となり学生がメール送信手続きを誤って何回も繰り返し送信してきても(これが結構頻度としては多いのである)惑わされることがなくなる。後から課題の修正版が何度送信されて来ようとも(これも多い!)少しも困らない。かなりの省力になる。

 (2)表計算ソフトと(3)FTPソフトの間の「編集作業」は、データをHTML化するだけだからまさにプログラム化する対象として最適である。これは毎回行う必要はなく、そろそろウエッブ上のデータを更新すべき時期になったかな、と思った時だけ行えばよい。

 こういうPerlプログラムを間にかませるだけで、こまごまとした仕事の連鎖が一つの仕事にまとめられ、かなりの省力化が計れるものである。実は(2)の表計算ソフトの中ではVBAマクロを使って作業しているのでほとんど手間はかかっていない。こういう仕組みを作り上げるには、前もって注意深い設計作業が必要になるが、一度完成してしまえば あとはチャランポランに過ごしていてもすべてうまくいくからPerlプログラムはやめられないのである。ただ、目視チェックだけは手を抜くことはできませんけどね。

 最近経験した“ちょっとした仕事”の中に面白いものがあった。数独の問題集の中から類似問題を検出するプログラムを作ることを思い立ったのである。詳しくは【数独欄】「数独の類似問題について考える」に紹介されているので参照してください。

 ここで作ったプログラムを更に改良しようと思い立ち、取り組んだのである。この経験から、Perlと数独とは なかなか相性が良いということを発見した。数独の問題という限られた領域の問題だから、問題の大きさがそれほど大きくなく、まさにPerlで遊ぶに相応しいスケールの問題になるからである。興味のある方は是非見て参考にしてください。
 Perlにあまり関心のない方でも、一度プログラムを見てPerlに関心を向けてくれるとうれしいです。プログラムの全体と実行結果、アルゴリズムの説明は 類似度検出プログラムの改良(V3.0) を参照してください。Perlの凄さがある程度分かると思います。■