Hatena::ブログ(Diary)

naoyaのはてなダイアリー

October 31, 2005

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

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

というわけで id:naoya からの今回の課題。

「スクリプトを実行することで、現在の日付を返すスクリプト」

ため日記 - プログラミング講座第2回

やっぱり最初は 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 が最近はアツイらしい。

ryu1roryu1ro 2005/10/31 10:36 ぼくもTime::Piece使ってます。でもlocaltimeは使わないかも。

print Time::Piece->new->strftime(’%Y/%m/%d %H:%M:%S’) . ”¥n”;

H.InabaH.Inaba 2005/10/31 10:48 標準で済ますなら、POSIX::strftimeは?

use POSIX ”strftime”;
print strftime”%Y/%m/%d %T¥n”, localtime;

H.Inaba H.Inaba 2005/10/31 11:16 もうDan Kogaiさんが同じことを書かれてました…

perlcodesampleperlcodesample 2012/05/11 22:06 > Time::Piece の微妙なところは標準モジュールじゃないところ。

これはどこ情報なのかな? 5.10以降は標準モジュールだと思うけれども。

naoyanaoya 2012/05/11 22:08 これ 2005年の記事ですよw > id:perlcodesample

naoyanaoya 2012/05/11 22:08 当時たぶん、stable は Perl 5.6 か 5.8 なので Time::Piece は標準じゃなかったと思います。

perlcodesampleperlcodesample 2012/05/12 21:37  ぜんぜん日付を見てなかったです。誤爆しました。すいません。

naoyanaoya 2012/05/12 21:54 いえいえー > id:perlcodesample