bart has asked for the wisdom of the Perl Monks concerning the following question:

Why does this even compile? Obviously it's a mistype in the "continue", and it doesn't quite do what is wanted, but I'm a annoyed, and puzzled, by what it does now. Any clues?
#! perl -wl use strict; for my $i (1 .. 10) { print $i; } cxontinue { print "#"; print "-"; }
Result:
Can't call method "cxontinue" without a package or object reference at + test.pl line 5. 1 2 3 4 5 6 7 8 9 10 # -

This is what B::Deparse makes of it, equally strange:

foreach my $i (1 .. 10) { print $i; } do { print '#'; print '-' }->cxontinue; test.pl syntax OK

Replies are listed 'Best First'.
Re: Why does this even compile?
by liz (Monsignor) on Sep 20, 2003 at 08:32 UTC
Re: Why does this even compile?
by PodMaster (Abbot) on Sep 20, 2003 at 08:21 UTC
    I thought you knew this trick ;)
    C:\>perl -MO=Deparse -wl #! perl -wl use strict; for my $i (1 .. 10) { print $i; } cxontinue { print "#"; print "-"; } __END__ foreach my $i (1 .. 10) { print $i; } do { print '#'; print '-' }->cxontinue; - syntax OK
    update: I could've sworn you didn't have that deparse stuff there a second ago, anyway, I suppose it's just indirect object notation ie ---> new CGI; eq CGI->new; --->new {'CGI'} eq CGI->new;.

    `perldoc perlobj' has an example, and here it is ;)

        $fred = find Critter "Fred";
        display $fred 'Height', 'Weight';
    
    These could be combined into one statement by using a BLOCK in the indirect object slot:
    display {find Critter "Fred"} 'Height', 'Weight';
    For C++ fans, there's also a syntax using -> notation that does exactly the same thing. The parentheses are required if there are any arguments.
    $fred = Critter->find("Fred"); $fred->display('Height', 'Weight');
    or in one statement,
    Critter->find("Fred")->display('Height', 'Weight');

    MJD says "you can't just make shit up and expect the computer to know what you mean, retardo!"
    I run a Win32 PPM repository for perl 5.6.x and 5.8.x -- I take requests (README).
    ** The third rule of perl club is a statement of fact: pod is sexy.

    Edit by tye, take paragraphs, long lines out of PRE

      So the indirect object notation makes a word plus a bare block be treated as a do BLOCK in normal OO notation? Eww. I was going to ask where this was good for, but you just supplied an example.

      Oh BTW, you can have the same problem if you mistype "else". If this block is the last thing in an enclosing block, it'll compile.

      #! perl -wl use strict; my $x = 1; if($x) { print "yes"; } esle { print "no"; }

      Result:

      Can't call method "esle" without a package or object reference at test +.pl line 6. yes no
      Yes I do. It shows what Perl makes of it, but still it makes no sense. Why does perl treat a code block as if it was a package/object reference?

        It's not treating the block as if it were a package name or object. It's treating the block as if it returned a package name or an object.