Morning All,

Thank you for the help, it's really useful and gives me plenty to look at.

When you know what something is called (e.g. anonymous subroutines) it
becomes much easier to look it up.

Thanks,
James

On Fri, Jul 20, 2018 at 5:47 PM, Octavian Rasnita <orasn...@gmail.com>
wrote:

> *From:* James Kerwin <jkerwin2...@gmail.com>
>
> 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
>
>
>

Reply via email to