On Thu, Sep 9, 2010 at 07:20, Jatin Davey <[email protected]> wrote:
> Hi
>
> I am a newbie to Perl , I was reading through one of the beginner level
> books on perl. I did not understand the concept of "Callbacks" and i have
> the following questions on it:
>
> 1. What are they ?
>
> 2. Why do we need them ?
>
> 3. What useful purpose do they achieve ?
>
> I was reading the following code to understand it but could not comprehend.
>
> *Code:*
>
> #!/usr/bin/perl
> use warnings;
> use strict;
> use File::Find;
> find ( \&callback, "/");
>
> sub callback {
> print $File::Find::name, "\n";
> }
>
> *End Of Code:*
>
> Thanks
> Jatin
>
[Callbacks][0] are a method of generalizing code. A classic example
is sorting. A sorting algorithm is completely general except for one
thing: how to compare the data being sorted. So most sorting
algorithms are written to take a callback as well as the data to be
sorted. The callback knows how to compare two items that are being
sorted.
#!/usr/bin/perl
use strict;
use warnings;
sub insertion_sort {
my $compare = shift;
my @sorted;
OUTER:
for my $item (@_) {
for my $i (0 .. $#sorted) {
if ($compare->($sorted[$i], $item) == 1) {
#insert item before the sorted item
#that is larger than it
splice @sorted, $i, 0, $item;
next OUTER;
}
}
#this must be the biggest item so far, put it at the end
push @sorted, $item;
}
return @sorted;
}
sub sort_numerically { $_[0] <=> $_[1] }
sub sort_lexically { $_[0] cmp $_[1] }
my @unsorted = (4, 3, 2, 6, 5, 1, 10, 100, 20);
print join(", ", insertion_sort \&sort_numerically, @unsorted), "\n";
print join(", ", insertion_sort \&sort_lexically, @unsorted), "\n";
Now, creating sort_numerically is a pain, it would be much better if
we could just create the comparison function when we needed it.
Luckily Perl 5 has this capability: [anonymous subroutines][1] (you
might hear some people calling them lambdas). In the previous example
I could have just said
print join(", ", insertion_sort sub { $_[0] <=> $_[1] }, @unsorted), "\n";
print join(", ", insertion_sort sub { $_[0] cmp $_[1] }, @unsorted), "\n";
One of the benefits of doing this is that it is now easy to reverse
the sort order:
print join(", ", insertion_sort sub { $_[1] <=> $_[0] }, @unsorted), "\n";
print join(", ", insertion_sort sub { $_[1] cmp $_[0] }, @unsorted), "\n";
[0]: http://en.wikipedia.org/wiki/Callback_(computer_science)
[1]: http://en.wikipedia.org/wiki/Anonymous_function
--
Chas. Owens
wonkden.net
The most important skill a programmer can have is the ability to read.
--
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
http://learn.perl.org/