[戻る]
[2000年度]

Perl入門

Perl は非常に使いやすいプログラミング言語です。 C を知っている人ならすぐに使えます。 文字列の操作に優れています。 センターのパソコンの一部および1号館1階のパソコンに 日本語化された perl (jperl) がインストールされるはずです(5月)。 それまでは仕方ありませんので、古い jperl(perl4) ですが、 謎の二面相さんによる移植版の jperl Win32用(Vector) を使うことにしましょう。 Iドライブに perl とでもいう名のディレクトリ(フォルダー)を作成し、 その中にjperl.exeを置いて下さい。コマンドプロンプトでそのディレクトリに移り、 jperl -vでバージョン等が表示されたらオッケーです。 自分の家でも使いたい人は ベクター 「Windows/ユーティリティ/テキストファイル用/Perl」 から適切なものをダウンロードしてインストールできます。 最新版に関しては下のほうの鈴木紀夫さんのページを見て下さい [その前に、Perl初心者の部屋のほうを覗いて、インストールに関する注意を 読んでおくべきである]。 数学科学生用のringにもインストールされています。

この授業では Perl を用いて、 ひと月のスケジュール表の HTML ファイルを自動生成することを目標とします。 例えば次のような表を作りたいわけです。

2000 年 3 月

*
*
*
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 の初歩

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. Per初心者の部屋 [Perl5 日本語マニュアル] [MS-WindowsでPerl のページ]
  2. 近藤嘉雪さんのPerl情報メモ
  3. 鈴木紀夫さんのPerlの部屋 [JPerl for MS-Windows]
  4. 河野真治さんPerlについて
  5. Perlプログラミング講座
  6. 結城浩さん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 などを使っている人はぜひ試してみて下さい。