JupiterHost.Net wrote: >> On Oct 3, JupiterHost.Net said: >> >>> I have a list of strings that start with an uppercase B, Q, or Z >>> >>> I need to sort them so they are in order of Q, B , then Z >>> >>> Any ideas or input on how to efficiently do that with sort() or even >>> map() is most appreciated :) perldoc -f sort|-f map didn't appear to >>> address this situation :( > > Jeff 'japhy' Pinyan wrote: > >> I would use map() before and after sort() to "correct" leading >> characters. >> >> my @sorted = >> map { tr/123/QBZ/; $_ } >> sort >> map { tr/QBZ/123/; $_ } >> @data; > > Xavier Noria wrote: > > > They all go in ASCII relative order except B <-> Q, thus a way to > get > it is to handle that special case and delegate to cmp the rest: > > > > my @sorted = sort { > > my $x = substr($a, 0, 1) . substr($b, 0, 1); > > $x eq "BQ" || $x eq "QB" ? $b cmp $a : $a cmp $b; > > } @array; > > > > I used the concatenation for clarity, you see the idea anyway if > that's > too expensive for your usage. > > Brilliant! I'll benchmark those ideas :) Thanks you two!
Read this for an explanation of Jeff's solution: http://en.wikipedia.org/wiki/Schwartzian_transform -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] <http://learn.perl.org/> <http://learn.perl.org/first-response>