Kenneth,

Below the cut is my example implementation as I understand your
requirements.
Note that the "compare" routine uses $a and $b which are "special" to perl
sort routines.
Also the compare routine is written for obviousness rather than for brevity
or elegance.

The return from compare illustrates Shalomi Fish's point about using the
"||" operator to compose sort fields.
Descending numeric order is done by reversing the comparison on that sub
field.

chris

----- cut -----
#!/usr/env/bin perl

use strict;
use warnings;

my @x = <DATA>;

sub compare {
    my @a = split(/\t/, $a);
    my @b = split(/\t/, $b);
    return $b[0] <=> $a[0] || $a[1] cmp $b[1]
}

print for (sort {compare} @x);

__DATA__
9500       ohzaew
5300       dohpha
0700       liemah
1700       phuhei
0200       phuowo
1300       ojaeng
3900       aebaat
4200       dohgha
4200       aiyiej
6300       ojaeng
1600       haequa
3100       hupiez
3200       ahrieb
3600       ohzaew
5300       queebe
2000       oeyael
0200       hahwoo
9900       shahye
9300       johhir
6400       shahye
4500       ohfici
5500       ahngoh
7300       aibove
8200       ahrieb
9100       ohzaew
3100       ohzaew
2800       gahnoh
0800       aedeng
8400       oowaih
0300       vouroh
1400       shahye
0500       ciejee
0500       uanahp
2100       ophuum
1500       aideev
6900       aegeuw
6300       haequa
9300       queebe
5400       reogai
5000       ophuum
1700       aebaat
1600       eshida
3700       beidae
5200       quieki
6800       eashoo
6800       ohweba
2300       apahqu
8100       ahghee
6700       jooxoj
3500       yeiboo
2800       chuema


On Fri, Jun 17, 2016 at 3:41 PM, Kenneth Wolcott <kennethwolc...@gmail.com>
wrote:

> On Fri, Jun 17, 2016 at 2:33 PM, Kenneth Wolcott
> <kennethwolc...@gmail.com> wrote:
> > Hi;
> >
> >   I'm having trouble understanding the built-in Perl sort with regards
> > to mixed numbers and strings
> >
> >   I'm looking at http://perldoc.perl.org/functions/sort.html
> >
> >   I have an array that I want to have sorted numerically and descending.
> >
> >   The array is composed of elements that look like the following regex:
> >
> >   ^\d+\t\[a-zA-Z0-9]+$
> >
> >   I always have "use strict" at the top of my Perl scripts.
> >
> >   If I try:
> >
> >     my @articles = sort {$b <=> $a} @files;
> >
> >   I get error(s)/warning(s) that the data is not numeric.
> >
> >   if I try:
> >
> >   my @articles = sort {$b cmp $a} @files;
> >
> >   I will get numbers sorted as letters, not numerically.
> >
> >   I tried to understand the sort perldoc page further down, but did
> > not grok it at all.
> >
> >   What I did as a workaround was to implement my own extremely
> > brute-force sort routine, which works, but is very ugly.
> >
> >   Since I have very few elements (perhaps as many as a couple dozen),
> > the inefficiency is immaterial.
> >
> >   I'd rather that my code be correct, intuitive and elegant (and
> efficient).
> >
> > Thanks,
> > Ken Wolcott
>
> Addendum:
>
> It appears that when the sequence of digits is the same length in all
> instances that the data will be sorted correctly, but when the length
> of the sequence of the digits is not the same in the entire data set,
> that is when the sort results will be incorrect.
>
> My most current data with this reverse character sort mechanism works
> correctly, but I'd like it to work in all cases.
>
> --
> 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