in reply to pop sort strangeness

Others have told you how to get max, but their solutions don't remove the element from the array, which your first example suggests you want to do, though your "works ok" example doesn't do that. If you do want it removed:
(my $max, @vals) = reverse sort @vals; # or sort {$b cmp $a} @vals # in any case, the one to assign to the scalar has to come first
I had thought that this would work:
my $max = pop(@vals = sort(@vals));
, but Perl sees pop's argument as a "list assignment" rather than an array, so I can't give you a one-line solution using pop.

On the other hand, if you don't want to modify @vals at all, it would make more sense to just do a max-finding search (an order-N task) rather than sorting the list (an order N*log(N) task).

use List::Util 'maxstr'; my $max = maxstr(@vals);

Caution: Contents may have been coded under pressure.

Replies are listed 'Best First'.
Re^2: pop sort strangeness
by Roy Johnson (Monsignor) on Nov 17, 2004 at 18:48 UTC
    I came up with a one-line pop solution:
    my $max = pop @{@vals=sort @vals; \@vals};
    It's kind of cheating in the "one-line" department, and I don't recommend it as clear programming, but it illustrates that "a BLOCK returning a reference" really means a BLOCK, not just an expression in curlies. Obviously the clear way to write it would be
    @vals = sort @vals; my $max = pop @vals;

    Caution: Contents may have been coded under pressure.