読者です 読者をやめる 読者になる 読者になる

ぱいぱいにっき

Pythonが好きすぎるけれど、今からPerlを好きになりますにっき

ちょっと書こうと思っていること

ぜんぜん調べてないのでもうあるのかもしれないし、
なんかPerlの流儀に沿ってないかもしれないんですけれど、
PythonにあってPerlにないものっていえばってことで。

package MyApp::Util::Decorator;
use strict;
use warnings;

use Sub::Decorator;
use Time::HiRes qw/gettimeofday tv_interval/;

use parent qw/Sub::Decorator/;

sub stopwatch {
    my ($self, $sub, @args) = @_;

    my $begin = gettimeofday();
    my @result = &$sub(@args);
    my $elapsed= tv_interval($begin, gettimeofday());
    warn $self->func_name.': '.$elapsed.' sec';
    return @result;
}
1;
use strict;
use warnings;
use 5.012;

use MyApp::Util::Decorator;

sub hogehoge :Decorator('stopwatch') {
    #do something
}

hogehoge(); # hogehoge: 0.xxx sec

みたいな。まあデコレータですね。
この場合は関数の実行にかかった秒数とか測っていますけれど、副作用のない関数であれば関数名と引数をキーにして結果をキャッシュしておけば、早くなるかもねという話も。

そんな感じです。