6.6 Closure Variables as Inputs
While the previous examples showed closure variables being modified,
closure variables are also useful to provide initial or lasting input
to the subroutine. For example, let's write a
subroutine to create a File::Find callback that
prints files exceeding a certain size:
use File::Find;
sub print_bigger_than {
my $minimum_size = shift;
return sub { print "$File::Find::name\n" if -f and -s >= $minimum_size };
}
my $bigger_than_1024 = print_bigger_than(1024);
find($bigger_than_1024, "bin");
The 1024
parameter is passed into the print_bigger_than,
which then gets shifted into the $minimum_size
lexical variable. Because you access this variable within the
subroutine referenced by the return value of the
print_bigger_than variable, it becomes a closure
variable, with a value that persists for the duration of that
subroutine reference. Again, invoking this subroutine multiple times
creates distinct "locked-in" values
for $minimum_size, each bound to its corresponding
subroutine reference.
Closures are
"closed" only on lexical variables,
since lexical variables eventually go out of scope. Because a package
variable (which is a global) never goes out of scope, a closure never
closes on a package variable. All subroutines refer to the same
single instance of the global variable.
|