きよへろのPerlコードをリファクタしようのコーナー No.2

2回目やってるっぽいので、今回も私家版を書いてみる。

というわけで id:naoya からの今回の課題。
スクリプトを実行することで、現在の日付を返すスクリプト

やっぱり最初は localtime を素で使っちゃうよね。Perl の入門書にはおそらくほとんど localtime での例になってると思われます。しかし、僕なら Time::Piece を使う。

#!/usr/local/bin/perl
use strict;
use warnings;
use Time::Piece;

my $lt = localtime;
printf "%s %s\n", $lt->ymd('/'), $lt->hms;

なぜって、localtime の関数型インタフェースがださすぎるから。Matt Sergeant タンのTime::Piece を使えば組み込みの localtime が OO インタフェースに変化します。

Time::Piece の微妙なところは標準モジュールじゃないところ。一時期は標準に組み込まれたらしいけど、標準に入ると改良とかがしづらいからという理由かなんかで、いまは標準から外れてるらしい。

Perl はサブルーチンの戻りにリストを与えることで、サブルーチンから複数の値を返すことができるけど(一部の言語から見るとまずその仕様がきもいし)、インタフェース的に美しくない。メソッド/サブルーチンの戻りは単一の値にして、複数の値を返却するようなら、そのロジックを分解するとか、振る舞いも持ってるオブジェクトを返すようにするっていうのがリファクタリングの基本且つ Perl のベストプラクティスな感じがする。

ということで、戻り値がリストになる組み込みの localtime は今時はあんまり使わないよ、という話。

その他 id:kiyohero のコードにツッコミ。

  • #!/perl/usr/bin って typo かい。shebang がこれでも実行できてるのは ActivePerl かなにかかしら。
  • use warnings か -w 使えと。
  • Perl Best Practice 的には組み込みの関数は括弧を省略しようということらしい。(sprintf とか)
  • ちなみに localtime はスカラーコンテキストだと現在時刻の文字列が返ってくるって知ってた?

なんだか偉そうな俺がきましたよ。

追記: DateTime が最近はアツイらしい。