As a default value.
Suppose you write a sub (or module) that processes some values, and you want to offer the caller the possibility to filter some of them. Now you've got two options:
`sub process {
my ($data, $filter) = @_;
# lengthy calculations with $data here ...
# in that length calculation you have to decide
# if you continue with your calculation:
for (@$data){
if ($filter) {
if ($filter->($_)){
push @$data, other_lengthy_calculation($_);
}
} else {
push @$data, other_lengthy_calculation($_);
}
}
# second option:
sub process {
my ($data, $filter) = @_;
# provide a default value for $filter
$filter = sub {1;} unless $filter;
# lengthy calculations with $data here ...
# in that length calculation you have to decide
# if you continue with your calculation:
for (@$data){
if ($filter->($_)) {
push @$data, other_lengthy_calculation($_);
}
}
`
You can see that the construct with the default value is much shorter (3 instead of ~8 lines), and it's much cleaner.
If you're interested in more details on callbacks, anonymous subs and many more advanced techniques, I strongly recommend the book "Higher Order Perl" by Mark Jason Dominus. |