in reply to Re: strangeness with prototypes and 'logical defined or'?
in thread strangeness with prototypes and 'logical defined or'?
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
$ perl -MO=Deparse -e " sub foo (&) {}; foo sub{;;} || 7 " Type of arg 1 to main::foo must be block or sub {} (not null operation +) at -e line 1, at EOF -e had compilation errors. sub foo (&) { } &foo(sub { } || 7); $ perl -MO=Deparse -e " sub foo (&) {}; foo sub{;;} // 7 " Type of arg 1 to main::foo must be block or sub {} (not null operation +) at -e line 1, at EOF -e had compilation errors. sub foo (&) { } &foo(sub { } // 7);
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 ...
$ perl -MO=Deparse -e " sub foo (&) {}; foo {;;} // 7 " Number found where operator expected at -e line 1, near "// 7" (Missing operator before 7?) Too many arguments for main::foo at -e line 1, near "// 7" syntax error at -e line 1, near "// 7" -e had compilation errors. sub foo (&) { } $ perl -e " // 1 " Number found where operator expected at -e line 1, near "// 1" (Missing operator before 1?) syntax error at -e line 1, near "// 1" Execution of -e aborted due to compilation errors. $ perl -le " sub foo (&) {}; foo sub{;;} +// 7 " Number found where operator expected at -e line 1, near "// 7" (Missing operator before 7?) Type of arg 1 to main::foo must be block or sub {} (not addition (+)) +at -e line 1, near "// 7" syntax error at -e line 1, near "// 7" Execution of -e aborted due to compilation errors. $ perl -le " sub foo (&) {}; foo sub{;;} +//, 7 " Type of arg 1 to main::foo must be block or sub {} (not addition (+)) +at -e line 1, at EOF Too many arguments for main::foo at -e line 1, at EOF Execution of -e aborted due to compilation errors. $ perl -le " sub foo (&) {}; foo sub{;;} ,//, 7 " Too many arguments for main::foo at -e line 1, at EOF Execution of -e aborted due to compilation errors.
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 :)
$ perl -le " sub foo (&) {shift->()}; print 1, do{foo {rand}} // 7 " 10.762115478515625 $ perl -le " sub foo (&) {shift->()}; print 1, do{foo {}} // 7 " 17
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^3: strangeness with prototypes and 'logical defined or'?
by Anonymous Monk on May 25, 2015 at 21:22 UTC | |
by Anonymous Monk on May 26, 2015 at 00:44 UTC |