Perl して見ました。

今まで何となく敬遠していたけど、ちょっとPerlに入門してiCalデータをCSV形式で取り出すプログラムを書いてみたら、結構いいじゃん。

MacOS X 標準で付いてくるスケジュール管理ソフト「iCal」は、拡張子が .ics のvCalender形式「iCalender形式」でデータを記録している。
この形式はインターネット上でスケジュール情報を交換しようということで規格化されたもので、Outlook などでも利用されている。
これは結構一般的なのもだが、予定(イベント)と日時だけを一行にして取り出したい場合があるのだが、iCalにはその機能が無い。
そこで、iCal2Hなどのソフトを自作したのだったが、UTF-8の漢字コードをshift-jisに変換するのに、Javaを使って、全体のGUIAppleScriptで書いたりして、結構な行数のものになった。(AppleScriptで書いたのはMacOS 8.x-9.xの時に、Palm2HというソフトをAppleScriptで書いていたのでそれを流用したため。)
今回、Perl のお勉強ということで、入門書を読みながら書いてみた。それが以下のもの。
(入門レベルで書いたものなので、ベテランの方が見ると稚拙なところが有るかもしれませんので、そういったご指摘は大歓迎です。)

#!/usr/bin/perl
# use encoding 'utf8', STDOUT=>'shiftjis';
while(<>) {
	$wk = "" if(/BEGIN:VEVENT/);
	$wk .= ',' . $1 if(/SUMMARY:(.+)?n/);
	$wk .= substr($1, 0, 4) . '/' . substr($1, 4, 2) . '/' . substr($1, 6, 2) . ',' if(/DTSTART;.+:([0-9]+)/);
	$wk .= substr($1,1, 2) . ':' . substr($1, 3, 2) if(/DTSTART;.+:[0-9]+(T[0-9]+)/);
	printf("$wk?n") if (/END:VEVENT/);
}

(「?」となっているところは「\」バックスラッシュです)
たったこれだけの行数で書けてしまうのは驚きだ! しかも Java + AppleScript と比べて処理が格段に速い。
(2行目は、出力をshift-jisにしたいときの宣言をコメントアウトしたもの)
このプログラムを、listCal.pl などの名前で保存して、実行権限を与えて
ターミナルから「./listCal.pl < Library/Calenders/(カレンダーの名前.ics) | sort > (出力ファイル名)」と実行する。
(もちろん、このコマンドも保存して実行権を与えておくと便利だ。
このperlのプログラムにAppleScriptGUIを加えると、iCal 2Hの高速版ができるなぁ...ま、そのうち