An anonymous subroutine that grabs lexical variables from its containing environment is a closure. Remember that it does not just take a snapshot of the value at the instant the anonymous subroutine is seen.
# declare an anonymous subroutine, and return a reference to it. my $foo = 10; $rs = sub { print "Foo is $foo\n"; # Grabs $foo }; &$rs(); # Call the closure through the reference
The closure keeps the grabbed variable's value around even when the variable goes out of scope.
sub init_counter { my $num = shift; # lexical variable to be grabbed $rs = sub { print $num++," "; }; return $rs; } $rs_counter = init_counter(10); # $rs_counter is a ref-to-sub for (1..5) {&$rs_counter()}; # Prints 10 through 14