Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?

Using form return value as subroutine name

by phirun (Novice)
on Jul 15, 2021 at 03:20 UTC ( #11135009=perlquestion: print w/replies, xml ) Need Help??

phirun has asked for the wisdom of the Perl Monks concerning the following question:

I'd like to use the return value from an HTML form as the name of a destination subroutine.

What is the most elegant solution for this?

  • Comment on Using form return value as subroutine name

Replies are listed 'Best First'.
Re: Using form return value as subroutine name (updated x2)
by AnomalousMonk (Bishop) on Jul 15, 2021 at 03:55 UTC

    Generally speaking, a function dispatch table:

    Win8 Strawberry (32) Wed 07/14/2021 23:52:13 C:\@Work\Perl\monks >perl use strict; use warnings; my %func = ( foo => sub { print "fooble: @_ \n"; }, bar => sub { print "barble: @_ \n"; }, ); my $from_form = 'foo'; $func{$from_form}(42, 'zot'); ^Z fooble: 42 zot

    Update 1: It's usually wise to check if the $from_form string actually exists in the %func dispatch table before trying to invoke it. :)

    Update 2: In Perl as in life, there's usually more than one way to do something. Another way to do what you want is called "symbolic referencing", also known as a "soft reference". This technique is Officially Frowned Upon. See Why it's stupid to `use a variable as a variable name' and also the perlfaq7 FAQ How can I use a variable as a variable name?

    Give a man a fish:  <%-{-{-{-<

      Thanks. Elegant indeed!
Re: Using form return value as subroutine name
by Discipulus (Abbot) on Jul 15, 2021 at 11:33 UTC
    Hello phirun

    generally speaking... never trust user input!! :)


    There are no rules, there are no thumbs..
    Reinvent the wheel, then learn The Wheel; may be one day you reinvent one of THE WHEELS.
      AnomalousMonk's solution generally solves this issue by creating an effective white list of acceptible keys, checked ahead of time with a simple exists or defined.
A reply falls below the community's threshold of quality. You may see it by logging in.

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://11135009]
Approved by davies
Front-paged by Corion
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (4)
As of 2022-01-22 18:38 GMT
Find Nodes?
    Voting Booth?
    In 2022, my preferred method to securely store passwords is:

    Results (63 votes). Check out past polls.