Perlリハビリまとめ

最近のリハビリで、だいぶモダンな書き方ができるようになったような気がする。結局今回いじった箇所は全書き換えはしてないんでそんなに新しくなってないんだけど、テストを含めて割と新しい使い方ができるようになった雰囲気。

Perl は後付け後付けで機能を拡張しているうえに古い情報が蔓延していることもあって、きちんと整理された新しい書き方を修得するのにそれなりに時間も掛かるが、古いスクリプトをそのまま動かすこともでき、ちゃんと書き直せば新しい機能の恩恵にも与れるという懐の深さはやはり非常にありがたい。今回初めて Perl 5.8 ならではの機能も試したが、これが出たのがもう5年前ですよ。どうよこの枯れっぷり。PHP に爪のあかを飲ましてやりたい。1

ただ、

  • 標準じゃないモジュールを探しまわるとか
  • リファレンスリファレンスリファレンス

うぜえよ。

CPAN モジュールは多過ぎるしうっかり手を出すと依存関係が面倒くさいし。まぁその辺含めてこうしろと言ってくれる、放任しない教師としてベストプラクティスはみんなにオススメなのかもしれないんだけど。

最後にまとめると、「書き直す機会があればやはり Ruby にしたいという気持ちが強くなった」のは間違いないっす。以前よりは Perl きらいじゃなくなったけどね。それがいちばんの収穫かなぁ。Golf系でない方法でコードを短くしていけばまだそれなりに耐えられるし。多少記法が違ってもコードそのものの見通しのよさには関係ないっつーことか2

[追記] あ。まだ調べてないのがあった。その辺りは、

  • 日付処理は Class::Date
  • 例外処理は Error

にしてみた。

DateTime は確かに便利なんだけど上で書いた依存性地獄に近いので却下。Fink にも deb にもパッケージがあるから扱いは楽だけど、そうでない環境に行ったときを考えると恐ろしい。Class::Date は pure Perl で小さすぎず大きすぎないところがよい。日付計算もできるのであれこれ道具を持ち替える必要がない。時刻の扱いは弱いけど、そのときは時刻だけにフォーカスしたものをまた探せばいいかな。そんなに必要ないと思うけど。ISO 8601 フォーマットって初めて知った。

例外は書き方が Error の方が分かりやすかったのでとりあえず選んでおく3。例外オブジェクトそのものの定義は Exception::Class が書きやすいかもしんないけど、eval して catch してっつーのはちょっと Perl 的すぎる感じがいやだ。Error.pm なら try {} catch with {} finally {} など分かりやすい。

例外オブジェクトはとりあえず Error::Simple を継承した適当なオブジェクトを作っておけばいいんじゃないのかしらんと踏んでいる。この辺、独自の知識やノウハウが必要ないのも Error.pm の方がよさげと判断するところ。ただ継承は Ruby なら class < だけで済むのに Perl だと package ; use base になってしまうというところが邪魔くさいんだけど 。もうそこはしゃあないか。ちっ。

以下は Perl 関連のエントリを並べ直してみたもの。

あと今まで書いたり書かなかったりしてたほんとに細かいけどフツーに使うのは、

  • use lib (@INC をいじる代わり)
  • use base (@ISA をいじる代わり)

これしかし逆に言うと lib とか base とかモジュールの名前としておいしい名前を使えなくなってしまっているのよね。

  • File::Basename
  • File::Spec
  • Cwd qw( realpath )

は必須。strict と warnings も必須。

本格的な Web アプリには使ってないのでその辺は知らない。テンプレートは HTML 目的で書き始めたけど、HTML 以外にも使ってます。

今度こそ最後。テストは個人的には Test::Unit::Case と Test::Unit::Runner を使う。Test::Harness 系というか Test::Simple 系というか、まぁ Test::Base なんだけど、あまりに Perl っぽすぎて独自すぎていやなので。

  1. というか Perl 5 らしい使い方にようやく追いついたのが実情なんだけど、Perl 5 が出たのはすでに10年以上前という… 

  2. 書きやすさは違うけど。モダンな書き方を目指すなら Perl より Ruby の方が短くしやすいし書きやすいと思う。 

  3. 散々ベストプラクティスを持ち上げといて実際自分はその通りにしないあまのじゃくっぷり。 

More