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

Reply via email to