good chemistry is complicated,and a little bit messy -LW PerlMonks

### Re: RFC:A brief tutorial on Perl's native sorting facilities.

by hawtin (Prior)
 on Feb 06, 2007 at 10:20 UTC Need Help??

When I am doing things with sort I have a standard routine (which I call lexically) that attempts to implement a more natural sort order.

Because of the scoping of \$a and \$b I have never made this into a module but normally just copy it into the script

```
foreach my \$foo (sort lexically @list)
{
...
}

...

sub lexically
{
# This routine gives us a sort order that more closely matches
# what a naive use would expect (ie "9-z" comes before "10-a")

# The simple implementation style makes the code easier
# to follow
my(\$a_,\$b_) = @_;

# If we are called by sort the old @_ gets left around
# attempt to detect this and grab values from \$a and \$b
if(!defined(\$a_) || !defined(\$b_) ||
ref(\$a_) || ref(\$b_) || \$#_ != 1)
{
\$a_ = \$a;
\$b_ = \$b;
}
return 0
if(\$a_ eq "" && \$b_ eq "");
return -1
if(\$a_ eq "");
return 1
if(\$b_ eq "");

my(\$a_1,\$a_t,\$a_2,\$b_1,\$b_t,\$b_2);

if(\$a_ =~ /^(\d+)/)
{
\$a_t = 0; \$a_1 = \$1; \$a_2 = \$';
}
elsif(\$a_ =~ /^(\D+)/)
{
\$a_t = 1; \$a_1 = \$1; \$a_2 = \$';
}

if(\$b_ =~ /^(\d+)/)
{
\$b_t = 0; \$b_1 = \$1; \$b_2 = \$';
}
elsif(\$b_ =~ /^(\D+)/)
{
\$b_t = 1; \$b_1 = \$1; \$b_2 = \$';
}

if(\$a_t == 0 && \$b_t == 0)
{
return lexically(\$a_2,\$b_2)
if(\$a_1 == \$b_1);
return \$a_1 <=> \$b_1;
}
if(\$a_t == 1 && \$b_t == 1)
{
# lower case (so "A" is the same as "a"
# which is what I want, YMMV)
my \$r = lc(\$a_1) cmp lc(\$b_1);
return lexically(\$a_2,\$b_2)
if(\$r == 0);
return \$r;
}
return -1
if(\$a_t == 0);
return 1;
}

Replies are listed 'Best First'.
Re^2: RFC:A brief tutorial on Perl's native sorting facilities.
by xdg (Monsignor) on Feb 06, 2007 at 12:26 UTC
I have never made this into a module but normally just copy it into the script

Your post was a great addition to the sorting tutorial. So it pains me to point out Sort::Naturally

-xdg

Code written by xdg and posted on PerlMonks is public domain. It is provided as is with no warranties, express or implied, of any kind. Posted code may not have been tested. Use of posted code is at your own risk.

Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://598508]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others chilling in the Monastery: (6)
As of 2024-09-08 14:08 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?

No recent polls found

Notices?
 • erzuuli ‥ 🛈The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.