Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses
 
PerlMonks  

strangeness with prototypes and 'logical defined or'?

by ed_hoch (Sexton)
on May 25, 2015 at 10:49 UTC ( [id://1127674]=perlquestion: print w/replies, xml ) Need Help??

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

on 5.16.2, why does

perl -ce 'sub foo (&) {} foo {;} || 7'

work just fine, while

perl -ce 'sub foo (&) {} foo {;} // 7'

gives compilation errors? this doesn't seem like a shell-escaping issue; if I copy it into a separate file, the same thing holds.

Thanks,

Ed

Thanks everyone for pointing out that the interpreter's recognizing the ambiguity with the "empty pattern"!

Replies are listed 'Best First'.
Re: strangeness with prototypes and 'logical defined or'?
by ikegami (Patriarch) on May 26, 2015 at 04:38 UTC

    // is being interpreted as a match operator, and that can't be followed by a term (7), thus the syntax error.

    || can't be interpreted as a term, so there's no ambiguity.

      It works this way:
      perl -ce 'sub foo (&) {} (foo {;}) // 7'
        Are you asking why it's interpreted as a defined-or in that case? Because it's impossible for a match operator to be present there.
Re: strangeness with prototypes and 'logical defined or'?
by Discipulus (Canon) on May 25, 2015 at 11:18 UTC
    also this works (my 0.002 cents):
    perl -ce "sub foo (&) {} foo (sub {;}) // 7"
    There are no rules, there are no thumbs..
    Reinvent the wheel, then learn The Wheel; may be one day you reinvent one of THE WHEELS.
Re: strangeness with prototypes and 'logical defined or'?
by Anonymous Monk on May 25, 2015 at 17:12 UTC
    Note that // can be 1) the defined-or operator 2) empty regex ("If the PATTERN evaluates to the empty string, the last successfully matched regular expression is used instead" - perlop).

    Seems to me Perl parses foo {;} // 7 as function_name indirect_object argument... rather then function_name argument operator...

      function_name indirect_object argument... rather then function_name argument operator...

      No, the message would be different if that was the case

      $ perl -le" ro sham bo " Can't locate object method "ro" via package "sham" (perhaps you forgot + to load "sham"?) at -e line 1.

      Its just never going to work the way the OP thinks it should (or I think he thinks it should)

      An anonymous subroutine is always defined

      So you can see there is no indirect object notation

      Its anonymous sub, match operator, and a seven, and these three scalars/expressions need to be separated by operators, like comma, plus minus ...

      Now you could argue it should just work, how come it recognizes three scalar expressions instead of recognizing one of them as an operator.... but its moot, the perlops || and // bind tight, there really is no avoiding the parenthesis :)

        So you can see there is no indirect object notation
        Well, syntactically print STDOUT "whatever", new Foo "whatever" and grep {;} "whatever" look pretty similar to me. I know only one name for it - "indirect object slot" - it's used for different purposes, yeah, but Perl is full of this kind of overloaded grammar so... Anyway, as far as I can tell foo {;} // 7 is parsed like grep {;} m// 7.
        $ perl -MO=Deparse -e 'sub foo(&) {;} foo {;} //' Too many arguments for main::foo at -e line 1, at EOF -e had compilation errors. sub foo (&) { } &foo(sub { } , //); $ perl -MO=Deparse -e 'sub foo(&) {;} foo {;} 1, 2, 3' Too many arguments for main::foo at -e line 1, at EOF -e had compilation errors. sub foo (&) { } &foo(sub { } , 1, 2, 3); $ perl -MO=Deparse -e 'sub foo(&) {;} foo {;} 1 2' Number found where operator expected at -e line 1, near "1 2" (Missing operator before 2?) Too many arguments for main::foo at -e line 1, near "1 2" syntax error at -e line 1, near "1 2" -e had compilation errors. sub foo (&) { }
        Its anonymous sub, match operator, and a seven, and these three scalars/expressions need to be separated by operators, like comma, plus minus ...
        Well, no comma is necessary between the "indirect object slot" (or whatever it's called) and the next argument. Only 7 needs a preceding comma.
Re: strangeness with prototypes and 'logical defined or'?
by Anonymous Monk on May 25, 2015 at 18:36 UTC

    work just fine, while ... gives compilation errors?

    What do you mean it works, what does it do?

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://1127674]
Front-paged by Corion
help
Chatterbox?
and the web crawler heard nothing...

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

    No recent polls found