Hi Chris,

On Mon, 20 Jun 2016 11:28:57 -0600
Chris Fedde <ch...@fedde.us> wrote:

> 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.
> 

Thanks for the illustrative example! I was too lazy to write one.

Regards,

        Shlomi Fish


> 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/
> >
> >
> >  


-- 
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