The canonical form of a subroutine invocation is:
$result = & { something_that_returns_coderef } ( @args );
The braces around the coderef expression can be dropped
only when the
coderef is in a simple scalar variable. Yours was not. So you'd have to use:
& { $functions{$func} }();
However, as of fairly recent Perls, you can also use an arrow form:
$functions{$func}->();
This was added by Chip in 5.4 under some urging by me based on a bet I made
that I couldn't get a new feature into 5.4 during the gamma golden release phase.
I won. {grin}
-- Randal L. Schwartz, Perl hacker
update: for more details, check out
my Linux
magazine column on subroutine references, and an
older
column from UnixReview.