prototype &

run {
    my $block = shift;
    is(process($block->foo), $block->bar, $block->name);
};

って引数に関数渡せる。

これは perldoc perlsub の Prototypes の項目に載ってる

An "&" requires an anonymous subroutine, which, if passed as the first argument, does not require the "sub" keyword or a subsequent comma.

プロトタイプで & を第一引数に指定した場合その無名関数には sub つけなくても良い。

これは割と使えそうだ。

たとえば、STDERRとかになんか出力しちゃううざいモジュールを使ってtestを書いているときに

sub execute(&) {
    my ($out, $err);
    tie_output( *STDOUT, $out );
    tie_output( *STDERR, $err );

    my $res = shift->();

    untie *STDOUT;
    untie *STDERR;

    $res;
}

とか作っとくと

my $res = execute { $suck_module_output_stderr->method };

とかでSTDERRだすことなくそのモジュールのテストかける。いいのー。

grep とかな実装しかあんまりみないから新鮮に見えるのかな。

by typester / at 2006-10-16T22:21:00 / perl / Comments(0)