ブロックスコープを使わずに関数や変数を局所化する方法

Perlではブロックスコープを使用して関数や変数の局所化が可能である。しかし、例えばその結果として出てくる変数がそのブロックの外で必要になる場合、一度それ用の変数をブロック外で宣言してから代入してやる必要がある。

my $hoge;
{
    sub get_one_plus_one {
        return 1+1;
    }
    $hoge = get_one_plus_one();
}
print $hoge; # 2

ここで、下記のreturningという関数を使うと変数をわざわざ外で一度空宣言しなくてもOKになる。

sub returning(&) {$_[0]->()}
my $hoge = returning {
    sub get_one_plus_one {
        return 1+1;
    }
    get_one_plus_one();    
};
print $hoge; # 2

ちょっとした違いなので好みの問題かもしれない…が、個人的には後者の方が好き。