in reply to Perversity of sorts

I am going to take a guess that given sort do_nothing(@in), do_nothing is being parsed as the name of the sort sub, and the (@in) is being parsed as the list to sort on. That's what it appears to be doing from the Deparse output, anyway.

Update: maybe not. this code does the same thing, and it doesn't use a named sub at all:

print sort sub { print "Args: @_\n"; @_ }->(qw(one two three))

Another update: using a named sub, it acts differently than the anonymous sub, though it returns the same thing and the anonymous sub gets sorted, but this one doesn't:

sub byfoo { print "Args: $a $b\n"; @_ } print sort byfoo(qw(one two three));

So perhaps my initial guess was correct, and I got tricked by the anonymous sub. I eagerly await a response from someone who can explain this! :-)

Final update: Ah, Tanktalus' post cleared it all up for me. How silly that I had forgotten sort can take a list and use the default comparison function! That explains why my anonymous coderef gets all the values at once, and they subsequently get sorted.

Replies are listed 'Best First'.
Re^2: Perversity of sorts
by tlm (Prior) on Apr 01, 2005 at 01:55 UTC

    I am going to take a guess that given sort do_nothing(@in), do_nothing is being parsed as the name of the sort sub, and the (@in) is being parsed as the list to sort on. That's what it appears to be doing from the Deparse output, anyway.

    Yes, that's exactly what Deparse shows, and that's my point: why is perl behaving this way. Perhaps the following variant makes the point more forcibly. I have redefined do_nothing to behave like a typical sort sub; the output now is sorted, but note that the sort sub (do_nothing) is being put to work with the syntax do_nothing( @in ):

    use strict; sub do_nothing { $a cmp $b } my @in = qw( e n i g m a ); my @out = sort do_nothing( @in ); print "@out\n"; __END__ % perl enigma.pl a e g i m n

    the lowliest monk