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.
The subroutine that you provide to sort is a callback subroutine. In
other words, you can't pass arguments to it, so the first line of your
subroutine "my($a, $b) = @_;" is clearing out the data that sort has
provided for you.
I've also tried replacing
if ($a > $b) { -1 } elsif ($a < $b) { 1 } else { 0 }
Which should be:
if ($a > $b) { return -1 } elsif ($a < $b) { return 1 } else { return 0 }
with
$b <=> $a
This is the preferred way to do it.
and it still didn't work.
I also tried this
sort { ($b =~ /(.*?),.*/)[0] <=> ($a =~ /(.*?),.*/)[0] } @array;
and it didn't work either.
It works for me:
$ perl -le'
my @array = ( "1,fresh", "2,testurl" );
@array = sort { ($b =~ /(.*?),.*/)[0] <=> ($a =~ /(.*?),.*/)[0] } @array;
print for @array;
'
2,testurl
1,fresh
John
--
Those people who think they know everything are a great
annoyance to those of us who do. -- Isaac Asimov
--
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/