関数処理をラップする


 Hook::LexWrapモジュールを使うと、関数を書き換えずに関数の前後に処理を挿入したり、関数の返値を変更することができます。
# 前後に処理を挿入する
use strict;
use warnings;
use Hook::LexWrap;

wrap 'foo',
    pre => sub { print "前処理\n"; },
    post => sub { print "後処理\n"; };

foo();
bar();

sub foo {
    print "foo()\n";
}

sub bar {
    print "bar()\n";
}

__END__
[実行結果]
前処理
foo()
後処理
bar()
# 処理の横取り
use strict;
use warnings;
use Hook::LexWrap;

wrap 'foo',
    pre => sub {
        my ($value) = @_;
        # $_[-1]に値を設定すると処理を横取りできます
        $_[-1] = "$valueは奇数" if $value % 2 != 0;
    };

foreach my $i (1..5) {
    print foo($i), "\n";
}

sub foo {
    my $value = shift;
    return "$valueです";
}

__END__
[実行結果]
1は奇数
2です
3は奇数
4です
5は奇数
# 返値の書き換え
use strict;
use warnings;
use Hook::LexWrap;

wrap 'foo',
    post => sub {
        # $_[-1]に値を設定すると戻り値を書き換えます
        # 呼び出しがリストコンテキストの場合
        # $_[0]に戻り値のリストのリファレンスが入ります
        if (ref $_[0] eq 'ARRAY') {
            $_[-1] = $_[0]->[0] . "です";
        } else {
            $_[-1] = $_[0] . "です";
        }
    };

foreach my $i (1..5) {
    print foo($i), "\n";
}

sub foo {
    my $value = shift;
    return $value;
}

__END__
[実行結果]
1です
2です
3です
4です
5です

関連項目

トレース表示