エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

どこまでも手続き的

わたしには珍しくPerlの話題。仕事で、とある人が作った、ログを整形するコードを見て「おや?」と思った次第。
コードは、時分秒ミリ秒をあらわす9桁の数字の列があって、それをHH:MM:SS.mmmの形に整形するというもの。気になった部分を抜き出してみるとこんな感じです。

$t =~ s/[0-9]{2}//;
$hour = $&;
$t =~ s/[0-9]{2}//;
$min = $&;
$t =~ s/[0-9]{2}//;
$sec = $&;
$t = "$hour:$min:$sec.$t";

ここではコードの善し悪しの判断は、また書いた人の技量とかはひとまず置いておいて。なぜこういうコードになったんだろう?としばし首をひねり。わたしだったらおそらくこんな感じにしただろうと(すぐにこのコードが思い浮かばず、2度3度試行錯誤したのは秘密です)。

$t =~ s/([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{3})/$1:$2:$3.$4/;

2つを見比べてみて。わかったことは、前者は手続き的、後者は宣言的ということ。前者は、2桁切り出し、また2桁切り出し、さらに2桁切り出し、そのすべてと残りを整形して連結、という手順で整形を表現しています。

正規表現は宣言的なので宣言的に書く方が相性がいいと思うのですが、手続き型に慣れているるがゆえに、こんなときも手続き的に書いてしまうんだろうか、と思った次第。