No need for globals, just have the coderef use lexicals in the scope it's declared in (i.e. use a closure).
{ my $returned_data = [ ]; sub my_fetch_callback { push @{ $returned_data }, $_[0] } routine_wanting_callback( \&my_fetch_callback ); for my $datum ( @{ $returned_data } ) { munge_it( $datum ); } }
Update: Moved bracket after for so it would, you know, actually work. Duurr. Stupid trees making pollen affecting sinuses with their pollen making brane numbing congestion stuff.
Another example: You could also pass a coderef which stores the results by calling methods on an object you provide.
my $line_holder = Line::Holding->new( ); routine_wanting_callback( sub { $line_holder->hold( $_[0] ) } ); $line_holder->process_held_lines;
Nothing says the callback has to call a named subroutine sitting in the symbol table (unless the callback wanting routine says it takes the name of a subroutine of course; but that'd just be bad design :).
In reply to Re: Why callbacks?
by Fletch
in thread Why callbacks?
by pileofrogs
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |