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/


Reply via email to