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

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);

Replies are listed 'Best First'.
Re^4: Dynamically constructed function calls
by dragonchild (Archbishop) on Nov 04, 2004 at 04:03 UTC
    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' );
        *$_ = sub ... doesn't work if $_ is an integer.
        Not true. Did you try it?
        $ perl -we'*$_ = sub { print "I am 1 $_[1].\n" } for 1; $x = bless {}; + $meth = "1"; $x->$meth("world")' I am 1 world.
        $_ isn't a lexical, so it doesn't get captured, producing "I am world" for output.
        Correct.
        What's after the -> has to start with a $, so do { @ARGV } wouldn't work even if it did return a scalar.
        dragonchild was responding to my suggestion that ->do{} be made to work.