Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine

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 wandering the Monastery: (3)
As of 2022-05-29 03:24 GMT
Find Nodes?
    Voting Booth?
    Do you prefer to work remotely?

    Results (101 votes). Check out past polls.