#!/usr/bin/perl use strict; use warnings; use IO::File; sub pseudo_block(&$) { my ($block, $fname) = @_; my $fh = new IO::File; if ($fh->open("<$fname")) { $block->($fh); $fh->close; } else { die "$fname open failed.\n"; } } pseudo_block { my ($fh) = @_; print <$fh>; } "test.dat";
ab cd efg
>perl pseudo_block1.pl ab cd efg
>perl pseudo_block1.pl test.dat open failed.
美しさから言えば、"test.dat"にあたるプロトタイプの順番を逆にして以下のようにしたいところだが、"{" "}"がハッシュコンストラクタとして解釈されてしまうらしく、syntax errorになってしまう。
sub pseudo_block($&) { my ($fname, $block) = @_; ... } pseudo_block "test.dat", { my ($fh) = @_; ... }
このように、トランザクション的な処理をカプセル化したい場合、強力なツールとして使用できる。誰でも簡単に思いつくのは、以下のような例ではないだろうか。
sub transact(&$) { my ($block, $dbh) = @_; try { $block->($dbh); $dbh->commit; } catch { $dbh->rollback; } } transact { my ($dbh) = @_; $dbh->do("(some sql)"); } $dbh;