クロージャとクラス

こんなんをやると変数を隠蔽しつつ、横断的に変数をもてるけど、

my ( $inc_cref, $get_counter_cref ) = var_share_closure();

$inc_cref->() foreach ( 0 .. 5 );

print $get_counter_cref->() . "\n";

sub var_share_closure {
 my $count = 0;
 return ( sub { $count++ }, sub { $count } );
}

6

変数を二つ返すのがなんとなく微妙な気もするので、どうせだったら、クラスにでもすればいいのかな。

my $counter = Counter->new;
$counter->countup for ( 0 .. 3 );

print $counter->get_counter;

package Counter;

sub new {
 my $pkg = shift;
 bless { counter => 0 }, $pkg;
}

sub countup {
 shift->{'counter'}++;
}

sub get_counter {
 shift->{'counter'};
}

4

みたいな?
でも、

$counter->{'counter'};

ってやったら丸見えなような気もするなあ。見えないほうがいいなあ。