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


in reply to Re^2: How to conditionally execute a subroutine defined as hash value
in thread How to conditionally execute a subroutine defined as hash value

You need to pass the parameters when you call the function, not when you store the reference.

See tye's References Quick Reference.

# Here you take the reference to the subroutine my $calls = { A => \&print_A, B => \&print_B, }; # Here you call the subroutine $calls->{ $test }->(\%config_A);

When taking the reference, you should never use parentheses.

Using Data::Dumper on %calls would show you what Perl stored in %calls.

Replies are listed 'Best First'.
Re^4: How to conditionally execute a subroutine defined as hash value
by Anonymous Monk on Apr 02, 2014 at 06:53 UTC
    Thanks but I need to pass %config_A when $test is A, and %config_B when $test is B.

      Then consider passing the appropriate parameter, depending on $test?

      my $config= 'A' eq $test ? \%config_A : \%config_B;

      Or even better, do the same for your data as you already did for your code:

      my %config= ( A => \%config_A, B => \%config_B, ); my $config= $config{ $test } or die "Unknown test '$test'";
        Thanks but it was a simplified example from what I'm doing. I need to test a templating system and so my stuff is more like this below and BrowserUK's solution allows me to set all in a single sub definition. However I like your solution too and I'll keep it in mind for other contexts. Thanks!
        my $test = 'show_stop_user'; my $calls = { show_home => sub { show_home($config) }, show_stop_user => sub { show_stop_user($config, {user=>'dummy',type=>'Users'}) }, admin_users_new_1 => sub { show_admin_user($config, { action=>'add', messages=>{ success=>['line1','line2'] }})}, admin_users_new_2 => sub { show_admin_user($config, { action=>'add' }) }, }; $calls->{$test}();
        Now I need to find out how I can redirect the Template::Toolkit output to the file $test.'.html' instead of screen...