How do I call sort with an anonymous subroutine stored in a hash ??

C

Casey

Hi, I haven't being using perl for too long. Can someone explain the
correct way to get the sort function to recognize an anonymous function
declared as a hash value? Look at my sample code for clarification:

#!/usr/bin/perl

@my_array = qw( g a z f u q m i e b );
$hash{my_sort_sub} = sub { $a cmp $b };
$hash{test_routine} = sub { print "test_routine works\n" };
&{$hash{test_routine}};
print @my_array;
print "\n";
print( sort &{$hash{my_sort_sub}} @my_array );
print "\n";


The code fails to compile with error:

Array found where operator expected at ./test.pl line 9, near "} "
(Missing operator before ?)
syntax error at ./test.pl line 9, near "} @my_array "
Execution of ./test.pl aborted due to compilation errors.

Help! I don't see what's wrong with this.
 
N

nobull

Casey said:
Can someone explain the
correct way to get the sort function to recognize an anonymous function
declared as a hash value?

AFAIK, you cannot. It's one of those nasty corners of Perl syntax
where to do the "right thing" would require unlimited lookahead (or
roll-back) in the parser. Perl doesn't even try - it's just
documented as a limitation.
print( sort &{$hash{my_sort_sub}} @my_array );

my $sort_sub = $hash{my_sort_sub};
print( sort $sort_sub @my_array );
Array found where operator expected at ./test.pl line 9, near "} "
(Missing operator before ?)
syntax error at ./test.pl line 9, near "} @my_array "
Help! I don't see what's wrong with this.

The syntax of the Perl sort function is explained in

perldoc -f sort

This newsgroup does not exist (see FAQ). Please do not start threads
here.
 
A

Anthony

you are dereferencing the anonymous subroutine incorrectly.

On line 9 you have:
print( sort &{$hash{my_sort_sub}} @my_array );

It should be:
print( sort {&{$hash{my_sort_sub}}} @my_array );

hope this helps,
Anthony
 
C

Casey

AFAIK, you cannot. It's one of those nasty corners of Perl syntax
where to do the "right thing" would require unlimited lookahead (or
roll-back) in the parser. Perl doesn't even try - it's just
documented as a limitation.


my $sort_sub = $hash{my_sort_sub};
print( sort $sort_sub @my_array );



The syntax of the Perl sort function is explained in

perldoc -f sort

This newsgroup does not exist (see FAQ). Please do not start threads
here.

Thanks for the solution. Have a good day.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,774
Messages
2,569,596
Members
45,139
Latest member
JamaalCald
Top