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