Perl は非常に使いやすいプログラミング言語です。 C を知っている人ならすぐに使えます。 文字列の操作に優れています。 センターのパソコンの一部および1号館1階のパソコンに 日本語化された perl (jperl) がインストールされるはずです(5月)。 それまでは仕方ありませんので、古い jperl(perl4) ですが、 謎の二面相さんによる移植版の jperl Win32用(Vector) を使うことにしましょう。 Iドライブに perl とでもいう名のディレクトリ(フォルダー)を作成し、 その中にjperl.exeを置いて下さい。コマンドプロンプトでそのディレクトリに移り、 jperl -vでバージョン等が表示されたらオッケーです。 自分の家でも使いたい人は ベクターの 「Windows/ユーティリティ/テキストファイル用/Perl」 から適切なものをダウンロードしてインストールできます。 最新版に関しては下のほうの鈴木紀夫さんのページを見て下さい [その前に、Perl初心者の部屋のほうを覗いて、インストールに関する注意を 読んでおくべきである]。 数学科学生用のringにもインストールされています。
この授業では Perl を用いて、 ひと月のスケジュール表の HTML ファイルを自動生成することを目標とします。 例えば次のような表を作りたいわけです。
日 | 月 | 火 | 水 | 木 | 金 | 土 |
---|---|---|---|---|---|---|
* |
* |
* |
1 |
2 二期編転入など出願締切 |
3 9:30人事委員会 |
4 |
5 |
6 9:30院入試打合せ 10:00-院入試 |
7 13:00問題封入 |
8 編転入試験・二期入試、選考委員会 |
9 |
10 10:00入試連絡会(本部) 14:00合否判定教授会 16:30入試連絡会 |
11 12:00大学院委員会 |
12 |
13 13:00奨学生候補者面接 |
14 13:00奨学生候補者面接 |
15 |
16 11:00教室会議 |
17 二期手続き締切 |
18 |
19 |
20 春分の日 |
21 11:00-学位授与式 |
22 |
23 |
24 13:30-院会議 |
25 |
26 |
27 (--30)学会(早稲田理工) |
28 |
29 |
30 |
31 |
* |
もちろん、手作業でぼちぼち作ってもいいのですが、スケジュールデータをもとに 自動的に作成できればとても便利です。
perl のプログラムファイルはテキストファイルです。 プログラムといわず、スクリプトということが多いです。 拡張子は .pl がよく用いられますが、なくてもかまいません。 スクリプトファイル(以下では foo.pl とする)を Windows の上で実行する場合は、 DOS プロンプト(コマンドプロンプト)で jperl foo.pl などとやります。 ring など UNIX 上ではスクリプトファイルに実行属性を つけます(chmod +x foo.pl)。 もし、パスの通ったところに foo.pl があるのならば、 foo.pl で実行できます。 そうでないのならば、./foo.plで実行できます。 ただし、これは第1行に #!/usr/bin/perl というおまじないがかいてある場合です。 そうでなければ、perl foo.pl とやります。 日本語を含むスクリプトファイルは Windows なら SJIS に、 UNIX なら EUC にコードを変更しておきます。
Perl の解説は検索すればいろいろみつかる
はずです。例えば次のようなものがあります。
さて、スケジュール表作成スクリプトですが、一から作るのはとても大変です。
与えられた月の1日が何曜日か判定する必要があるでしょうから、
「曜日の計算」「カレンダー」「perl」などをキーワードにして検索してみましょう。
それが面倒な人のためにはこんなページがあります:
Zeller の公式というものがあるようですね:西暦 y 年 m 月 d 日 の曜日は
(y + [y/4] - [y/100] + [y/400] + [2.6m + 1.6] + d ) mod 7ただし、0 は日曜、1 は月曜、……、6は土曜を表し、m = 1, 2 の場合は それぞれ前年の13月, 14月とみなします(つまり y -> y-1, m->m+12)。
2 のほうにはもろにカレンダー出力のperlスクリプトがありますね。
あるものを使わないのはもったいないですから、これをもとに作成しましょう。
(1行目の perl のパスを書き換えたものが
これ(cal.pl)です。-- スクリプトと出力例)
●解説 「perlの第1歩」
課題:Zeller の公式の意味はわかりますか。 どのようにしてこの公式を導いたのでしょう。
課題:日付を与えて曜日を(0〜6の数値で)返すスクリプトを作りなさい。
課題:もとのカレンダー表示スクリプトをもとにして、
HTML による表を出力するスクリプトをつくりなさい。
●解説 「出力の工夫」
課題:データファイルを読み込み、それを表の中に出力するようにしなさい。
●解説 「ファイルの読み込みと行の処理」
●解説 「ファイルの入出力--補足」 -- とばしてもかまいません!
●解説 「文字列の処理」 -- とばしてもかまいません!
課題:日曜日のセルは色が変わるようにしなさい。
課題:祝日のセルも色が変わるようにしなさい。天皇誕生日は現在の天皇誕生日だけを考慮することにしましょう(つまり昭和以前は無視)。 2000年をさかいに、成人の日と体育の日が変わりましたので、注意すること。 春分の日・秋分の日は年によって異なりますが、とりあえず
春分 1980-2099 [20.8431 + 0.242194*(年-1980)-[(年-1980)/4]] 秋分 1980-2099 [23.2488 + 0.242194*(年-1980)-[(年-1980)/4]] 春分 1900-2099 [(8(年-1980)+687)/33]-[(y-1980)/4] 秋分 1980-2099 [(8(年-1980)+766)/33]-[(y-1980)/4]のような簡易計算式をつかえばいいでしょう。
課題:振替休日にも対応させなさい。
課題:データファイルで臨時の休日(大学の創立記念日など)を指定してその日の セルの色を変えられるようにしなさい。
参考にならないかもしれませんが、サンプルも置いてあります: htmlcal.pl(すごく遅い)、 htmlcal2.pl(少しはマシ?)。 (どちらもデータの形式をdata2.txtのように 想定しています。)
D. Skoll さんのRemindというカレンダー・ツールを使っています。 これが非常に優秀で、データファイルで簡単なプログラムが書けるので、 かなりややこしい指定の仕方が可能です。 通常は Tcl/Tk を利用して X 上で使いますが、 HTML の出力も可能です。 Linux などを使っている人はぜひ試してみて下さい。