#navi_header|Perl| - [[Perl/codepiece/pseudo_block]]では、ブロックに渡す引数をブロックの後ろに持って行く手法を示した。 - その後、頭が Cool Down した後、何とか引数をブロックの前の第一引数に指定できないかと思案した結果、多少不格好にはなるがとりあえずできた。 - <= Perl 5.8 - pseudo_block2.pl #!/usr/bin/perl use strict; use warnings; use IO::File; sub pseudo_block($&) { my ($fname, $block) = @_; my $fh = new IO::File; if ($fh->open("<$fname")) { $block->($fh); $fh->close; } else { warn "$fname open failed.\n"; } } pseudo_block "test.dat", sub { my ($fh) = @_; print <$fh>; }; - 出力はpseudo_blockと同じ。 見かけ上どう感じるかは個人の主観による。但し、このように引数を前に持ってきてしまうと、 '' リストを渡せない '' ことになる。以下のようにしてしまうと、最初の括弧対が、サブルーチンの引数を囲む括弧対として認識されてしまい、エラーになってしまう。 pseudo_block (1, 2, 3), sub { my ($x, $y, $z) = @_; ... }; どうしてもリストを渡したい場合は、配列へのリファレンスを渡す。→試しにやってみたらエラーにならず、上手く動いた。 sub hogeblock($&) { my ($args, $block) = @_; $block->($args); } hogeblock [ 1, 2, 3, 4 ], sub { my ($args) = @_; print @$args; } #navi_footer|Perl|