Beefy Boxes and Bandwidth Generously Provided by pair Networks
Keep It Simple, Stupid
 
PerlMonks  

Re^2: Dynamically constructed function calls

by dpuu (Chaplain)
on Nov 04, 2004 at 01:07 UTC ( #405066=note: print w/ replies, xml ) Need Help??


in reply to Re: Dynamically constructed function calls
in thread Dynamically constructed function calls

It has to be a scalar, but it doesn't need to be a variable. You can say

$f->${\("prefix_$key")}($atr);
However, using a variable is probably clearer.

Update: added the missing '$' pointed out by ikegami

--Dave
Opinions my own; statements of fact may be in error.


Comment on Re^2: Dynamically constructed function calls
Download Code
Re^3: Dynamically constructed function calls
by itub (Priest) on Nov 04, 2004 at 01:54 UTC
    Nice trick, I had never thought about that! :-)
Re^3: Dynamically constructed function calls
by ysth (Canon) on Nov 04, 2004 at 02:07 UTC
    I've toyed with the idea of making $object->do {expression-yielding-method-name} work. Right now it gives a syntax error.

    Of course, you can do something pretty close by just having a do method:

    sub foo { print "in foo" } sub do { my $self = shift; my $meth = shift; $self->$meth(@_) } $object->do("foo", @args);
      It would have to be something that has scalar context applied to it. That would yield some neat obfu.
      package Foo; sub new { bless {}, shift } *$_ = sub { my ($self, $arg) = @_; print "I am $_ $arg.\n" } for 1 .. +5; package main; my $foo = Foo->new; $foo->do { @ARGV }( 'world' );

      Blammo! :-)

      Being right, does not endow the right to be rude; politeness costs nothing.
      Being unknowing, is not the same as being stupid.
      Expressing a contrary opinion, whether to the individual or the group, is more often a sign of deeper thought than of cantankerous belligerence.
      Do not mistake your goals as the only goals; your opinion as the only opinion; your confidence as correctness. Saying you know better is not the same as explaining you know better.

        *$_ = sub ... doesn't work if $_ is an integer.

        $_ isn't a lexical, so it doesn't get captured, producing "I am world" for output.

        What's after the -> has to start with a $, so do { @ARGV } wouldn't work even if it did return a scalar.

        The following works

        package Foo; sub new { bless {}, shift } do { my $n=$_; *${\"n$n"} = sub { my ($self, $arg) = @_; print "I am $n $arg.\n" } } for (-1..5); package main; my $foo = Foo->new; $foo->${\(n.@ARGV)}( 'world' );
Re^3: Dynamically constructed function calls
by ikegami (Pope) on Nov 04, 2004 at 04:37 UTC

    You're missing a $. It should be $f->${\("prefix_$key")}($atr);

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (13)
As of 2015-07-02 09:48 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (33 votes), past polls