Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling
 
PerlMonks  

Re^2: Dynamically constructed function calls

by dpuu (Chaplain)
on Nov 04, 2004 at 01:07 UTC ( [id://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.

Replies are listed 'Best First'.
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 (Patriarch) on Nov 04, 2004 at 04:37 UTC

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

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! :-)

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others contemplating the Monastery: (2)
As of 2024-04-26 07:06 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found