http://www.perlmonks.org?node_id=471075


in reply to Calling a subroutine from a scalar

Your question suggests a logical confusion. One can't store a subroutine in a scalar variable. You can store a reference to a subroutine in a scalar variable, or you can, as in your code, store the name of a subroutine in a scalar variable.

In the former case, the answer to your question is easy:

my $coderef = \&some_sub; # $coderef contains a reference to &some_su +b my $results = $coderef->();

In the latter case, you can either use eval:

my $subname = 'some_sub'; my $results = eval "$subname()"; die $@ if $@;
or you can treat it as a symbolic ref:
my $results = do { no strict 'refs'; $subname->() };

use strict; use warnings; sub some_sub { print "Hello world!\n"; return 42; } my $coderef = \&some_sub; my $subname = 'some_sub'; print $coderef->(), "\n"; print eval "$subname()", "\n"; die $@ if $@; print do { no strict 'refs'; $subname->() }, "\n"; __END__ Hello world! 42 Hello world! 42 Hello world! 42

But storing names of subroutines in variables should be a red flag to alert you that you are probably not thinking about the problem in the right way.

the lowliest monk