Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Re: Technique for building arguments from function name?

by Corion (Patriarch)
on Dec 04, 2017 at 19:33 UTC ( [id://1204885]=note: print w/replies, xml ) Need Help??


in reply to Technique for building arguments from function name?

I don't recommend this technique, but have a look at AUTOLOAD:

our $AUTOLOAD; sub AUTOLOAD { if( $AUTOLOAD =~ /.*?::function_(\w+)$/ ) { function_x( $1 ); } else { die "Unknown function '$AUTOLOAD' called"; }; }

Update: Perlbotics points out that my approach needs to skip main:: or other package names.

Replies are listed 'Best First'.
Re^2: Technique for building arguments from function name?
by nysus (Parson) on Dec 04, 2017 at 19:56 UTC

    Ah, yes, the old AUTOLOAD. You have proven, once again, that you have forgotten more Perl than I have even remembered. What are the downsides of doing this? I was toying with the idea of generating HTML code like this:

    add_h1('Title'); add_p('Here is the opening paragraph.')

    What is this technique called? There must be a name for it.

    $PM = "Perl Monk's";
    $MCF = "Most Clueless Friar Abbot Bishop Pontiff Deacon Curate Priest";
    $nysus = $PM . ' ' . $MCF;
    Click here if you love Perl Monks

      What is this technique called? There must be a name for it.

      Well, this technique resembles what the ol' CGI.pm was doing in its days. I would say that it is against the DRY principle in software development - Don't Repeat Yourself - so whilst it might have a name, it surely is not a flattering one. Writing

      add_h1('Title'); add_p('Here is the opening paragraph.')

      requires two functions, while writing

      add('h1','Title'); add('p','Here is the opening paragraph.');

      requires only one, which means less code and a smaller memory footprint, at the expense of typing 2 more chars in the source for every call ('' against _). So, having a function for every tag is overkill, as haukex correctly points out.

      There are plenty of ways of generating HTML code in a more flexible way, e.g. Mason (before and after going the Moose way), Template::Toolkit and other templating solutions.

      For more overkill, but with the benefit of writing HTML in a perlish way, see Re: Perl module for RELAX NG? (shameless plug) which converts every tag of a DTD to its function, which takes a block as first argument. I use it only to write templates to be processed by a templating engine, since it is pretty slow. See also Which internal DSL are there in Perl? (Domain Specific Languages - Part 1).

      perl -le'print map{pack c,($-++?1:13)+ord}split//,ESEL'
        You might be interested to look into CGI::HTML::Functions

        Good point! Quoting that doc:

        If you really want to continue using the HTML generation functionality of CGI.pm then you should take a look at HTML::Tiny instead, which may give you a migration path away from CGI.pm's html generation functions; i strongly encourage you to move towards template driven page generation for anything involving markup as it will make porting your app to other frameworks much easier in the long run.

        And CGI::Alternatives mentions, among several others, Template::Toolkit.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1204885]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others scrutinizing the Monastery: (6)
As of 2024-04-20 02:30 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found