http://www.perlmonks.org?node_id=590879


in reply to Sorting result of function call

I can confirm the same result on cygwin with 5.8.7:

% stephan@armen (/home/stephan) % % perl -w sort_context.px get_keys called:array:13 called:array:13 called:array:13 called:array:13

deparse tells us:

% stephan@armen (/home/stephan) % % perl -MO=Deparse sort_context.px use warnings; use strict 'refs'; my(%h) = (1, 2, 3, 4); sub say { print @_, $/; } sub get_keys { print 'called:'; if (wantarray) { print 'array:'; } else { print defined wantarray ? 'scalar' : 'void'; } return keys %h; } say sort('get_keys'); say((sort get_keys ())); say sort(&get_keys); say sort(&get_keys()); say sort(@{[get_keys()];}); say sort(@{[get_keys()];}); sort_context.px syntax OK
so in the first case get_keys gets interpreted as a string. seems like a bug (an old one...) with use strict; (especially if one follows the principle of least surprise) still it's true that it is quite ambiguous... hth --stephan

Replies are listed 'Best First'.
Re^2: Sorting result of function call
by Hofmator (Curate) on Dec 20, 2006 at 10:45 UTC
    Thanks for trying that out. Deparse is a good idea, I get the same results as you except for case two, where my Deparse says
    say sort('get_keys' ());
    vs your
    say((sort get_keys ()));

    Interestingly, feeding my Deparse output back to perl leads to a syntax error. Your version seems to indicate what perl is doing here. Trying to sort the empty list () with the compare-function get_keys, hence the empty return.

    -- Hofmator

    Code written by Hofmator and posted on PerlMonks is public domain. It is provided as is with no warranties, express or implied, of any kind. Posted code may not have been tested. Use of posted code is at your own risk.