On Mon, 2008-12-15 at 20:33 -0500, Christopher Yee Mon wrote: > I have an array of strings whose members consist of a number followed by > a comma followed by a text string > > e.g. > 1,fresh > 2,testurl > > I want to sort by descending numerical order according to the number > part so I made this sort subroutine > > sub by_counter_field { > my($a, $b) = @_; > $a =~ s/^(.*?),.*/$1/g; > $b =~ s/^(.*?),.*/$1/g; > > if ($a > $b) { -1 } elsif ($a < $b) { 1 } else { 0 } > } > > and sorted it with > sort by_counter_field @array; > and it didn't work. > > I've also tried replacing > if ($a > $b) { -1 } elsif ($a < $b) { 1 } else { 0 } > with > $b <=> $a > and it still didn't work. > > I also tried this > sort { ($b =~ /(.*?),.*/)[0] <=> ($a =~ /(.*?),.*/)[0] } @array; > and it didn't work either. > > I can't figure it out for the life of me > > Any assistance would be deeply appreciated.
Use the Schwartzian transform: #!/usr/bin/perl use strict; use warnings; my @array = (); while( <DATA> ){ chomp; push @array, $_; } my @sorted = map { $_->[0] } sort { $b->[1] <=> $a->[1] # descending numeric || $a->[2] cmp $b->[2] } # ascending alphabetic map { [ $_, split( /,/, $_ ) ] } @array; for ( @sorted ){ print "$_\n"; } __DATA__ 1,fresh 2,testurl 2,another -- Just my 0.00000002 million dollars worth, Shawn The key to success is being too stupid to realize you can fail. -- To unsubscribe, e-mail: beginners-unsubscr...@perl.org For additional commands, e-mail: beginners-h...@perl.org http://learn.perl.org/