From: James Kerwin
Afternoon all,
I have been asked to take a look at a .pl file which is part of a set-up
called "EPrints". The particular file controls who can access documents on a
server.
Excluding some comments, the file starts like:
$c->{can_request_view_document} = sub
{
my( $doc, $r ) = @_;
It then goes on to complete the subroutine and return a value.
I understand that $doc and $r are populated via @_ but I have never before
seen the structure of the first line starting with "$c". Additionally, the file
doesn't look like a typical Perl file (eg.#!/usr/bin/perl -w at the top and
some use statements).
I know it's very vague, but could anybody explain this syntax to me? My
suspicion is that something else is calling the subroutines in this file? Am I
at least on the right track?
Thanks,
James
Hi, James
Yes, you are on the right track.
This is an annonymous subroutine which is probably used as a callback
subroutine somewhere else.
You can define such subroutines using a code like:
my $my_sub = sub { ... }
Then you can use the $my_sub variable as any other scalar variables, for
example as a parameter in another subroutine call, like:
do_something( $my_sub );
...then the sub do_something could use this sub like:
sub do_something {
my ( $sub ) = @_;
$sub->(); #execute the callback subroutine here
}
If this subroutine accepts parameters, you can call it like:
$my_sub->( $doc, $r );
Now, in your case, you don't have a scalar variable $my_sub to store this
subroutine, but you have another scalar value of a hashref $c, stored in the
key can_request_view_document, which is $c->{can_request_view_document},.
So in order to execute this sub, you do:
$c->{can_request_view_document}->( $doc, $r );
The code is common Perl code. It doesn't matter that the file doesn't start
with #!/usr/bin/perl
The shebang line is not needed if the program is executed with a command like:
perl program.pl
--Octavian