in reply to (SOLVED) parsing problems with prototype blocks (precedence)

«+ foo {$t}» is found where an argument would be. An expression is expected, so «+» is treated as a unary operator, so

foo {$Q} + foo {$t}

is the same as

foo {$Q} foo {$t}

To get the desired result, you can use the following:

( foo {$Q} ) + foo {$t}

Update: Replaced "Fixed:" with clearer wording.

Replies are listed 'Best First'.
Re^2: (SOLVED) parsing problems with prototype blocks (precedence)
by LanX (Saint) on Nov 03, 2021 at 16:25 UTC
    UPDATE: I may have misunderstood your post, and FIXED is meant as workaround.

    > Fixed: ( foo {$Q} ) + foo {$t}

    no, it's not, because this was what I expected.

    > + is treated as the unary operator, so

    And it would be binary

    use strict; use warnings; sub foo (&){ shift->()} sub baz (&){ shift->()} sub bar {3} my ($Q,$t,$res) = (10,3); sub tst { ( foo {$Q} ) + baz {$t}; } use B::Deparse; print B::Deparse->new('-p')->coderef2text(\&tst); print tst();
    C:/Strawberry/perl/bin\perl.exe -w d:/tmp/pm/sym.pl { use warnings; use strict; (foo(sub { $Q; } ) + baz(sub { $t; } )); }13

    update
    FWIW I chose + for an example which at least compiles b/c of the ambiguity.

    I originally used / which fails without having any unary meaning (it's seen as the start of a m//)

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    Wikisyntax for the Monastery

      Yes, by "Fixed: ( foo {$Q} ) + foo {$t}", I meant "You can fix the problem by using ( foo {$Q} ) + foo {$t}"