in reply to Re^14: Experimental features: autoderef vs postfix deref
in thread Experimental features: autoderef vs postfix deref

Does that template exist in the documentation? The one I cited does.

Why not make your straw man ${ ${ $foo->{bar} }{baz} } = 4? A. Because that would be even more stupid.

Why not just $foo->{bar}{baz} = 4; the way 90% of people write it? A. because that would highlight how verbosely hieroglyphic the postfix syntax is ->@*.

Replies are listed 'Best First'.
Re^16: Experimental features: autoderef vs postfix deref
by Anonymous Monk on Jul 14, 2015 at 02:56 UTC
    Why not make your straw man ${ ${ $foo->{bar} }{baz} } = 4? A. Because that would be even more stupid.
    :-) OK, let's try:
    ${ $foo->{bar}{baz} } = 4:
    Still looks stupid?

    What about:

    @{ $foo->{bar}{baz} }[0, 5] = (3, 4);
    I guess, also too stupid?

    Let's try some more:

    @{ $foo->{bar}{baz} }{ 'John', 'Jane', 'Bill' } = ('Smith') x 3;
    Stupid?

    If not, then why

    ${ $foo->{bar} }{baz} = 4;
    becomes stupid? Maybe because you can actually avoid circumfix dereferencing here?

    Why not just $foo->{bar}{baz} = 4; the way 90% of people write it?
    That's what I'm asking. Why 90% of people try to avoid circumfix when they can?

      Why 90% of people try to avoid circumfix when they can?

      They're not "avoiding"; they just not adding what would be pointless.

      Just as those in favour of postfix deref won't add: $foo->{bar}->{baz}->$* = 4;, because that would be equally pointless.

      So, back to the real argument.

      When explicit dereferencing is actually required, is push @{ $foo->{bar}{baz} }, 4;

      Simpler, clearer, easier to scan and less ugly than push $foo->{bar}->{baz}->@*, 4;

      And clearly the answer is yes. /c

        Just as those in favour of postfix deref won't add: $foo->{bar}->{baz}->$* = 4;, because that would be equally pointless.
        :-) What would be pointful instead? (what is the equivalent but pointful expression?)

        So, back to the real argument.

        When explicit dereferencing is actually required, is push @{ $foo->{bar}{baz} }, 4;

        Simpler, clearer, easier to scan and less ugly than push $foo->{bar}->{baz}->@*, 4;

        Sure, just like
        $foo->{bar}{baz} = 4;
        is simpler, clearer, easier to scan and less ugly than
        ${ $foo->{bar} }{baz} = 4;
        just like
        $foo->{bar}{baz}->@[1, 2, 3] = (100, 200, 500);
        is simpler, clearer, easier to scan and less ugly than
        @{ $foo->{bar}{baz} }[1, 2, 3] = (100, 200, 500);
        just like
        $foo->{bar}{baz}->$* = 4;
        is simpler, clearer, easier to scan and less ugly than
        ${ $foo->{bar}{baz} } = 4;
        And I think no one is going to take push @{ stuff }, stuff away from you?

        Back to the real point

        Postderef is good for exactly the same reason that the existing -> operator is good. Most people prefer to read and write in one direction (such as left-to-right) rather than inside-out. Postderef syntax is especially good for slices - @{ $foo->{bar} }[1, 2, 3] is 'pointless' for the same reason that ${ $foo->{bar} }{baz} is 'pointless'. The reason is inside-out reading. I also don't see why it shouldn't work for the whole thing - you still get to read the expression left-to-right, so it's still just as good. If it works at all, it should work everywhere, including push, even if you some find it 'ugly' or 'pointless'.