That's becauase this is a closure and $count retains its value between calls, since there is actually an instance of $count being carried around in the coderef.
Either move $count into the outer scope, so you can clear it between calls, or generate a new set closures, modding the previous poster's code Re: Closures and sort :
use strict;
my @list = qw/ box cow dog apple ant/;
sub mksub
{
my $count = 0;
my $s1 = sub { return $count }; # an inspector as a closure
# and another closure
my $s2 = sub
{
$count++;
return $_[0] cmp $_[1];
};
return ( $s1, $s2 );
}
my ( $get_count, $compare, );
( $get_count, $compare, ) = mksub();
print sort { $compare->( $a, $b ) } @list;
print "\n";
print $get_count->(), "\n";
print "\n";
print sort { $compare->( $a, $b ) } @list;
print "\n";
print $get_count->(), "\n";
print "\n";
( $get_count, $compare, ) = mksub();
print sort { $compare->( $a, $b ) } @list;
print "\n";
print $get_count->(), "\n";
print "\n";
Which produces:
antappleboxcowdog
9
antappleboxcowdog
18
antappleboxcowdog
9
Update: as someone else said, creating a reset_count coderef inside the same scope would do this and be cleaner than what I did.
--Bob Niederman, http://bob-n.com |