in reply to Inconsistent column Schwartzian Transform attempt
#!/usr/bin/perl -w use strict; my @unordered = ( '12 Corinthians 5:10', 'Hebrews 11:15', '1 Corinthians 13:23', '2 Corinthians 1:3', 'John 3:16', '1 Corinthians 12:10', '1 Corinthians 2:10', '1 Corinthians 2:10' ); my @ordered = map { $_->[0] } sort { $a->[1] cmp $b->[1] } map { [ $_, sprintf("%05d %-20s %04d %04d",/^\d/?():(99999), split(/[ +:]/)) ] } @unordered; print join "\n", @ordered; exit;
By adding the
/^\d/?():(99999)
and sprintf'ing the string so it compares lexicographically, you're in good shape, I think.
If you had a huge set of data to work with, you might want to do it this way instead, which I think might be faster (and might be the GR transform, I'm not sure):
# ... my @ordered = map { (split /\t/)[1] } sort { $a cmp $b } map { sprintf("%05d %-20s %04d %04d", /^\d/?():(99999), split(/[ :]/)) ."\t$_" } @unordered; # ...
Make sense?
--
Mike
(Edit: removed debugging prints from sort block)
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
And lexicographically means...
by RMGir (Prior) on Mar 16, 2002 at 16:36 UTC | |
by Juerd (Abbot) on Mar 16, 2002 at 18:17 UTC | |
by RMGir (Prior) on Mar 16, 2002 at 19:41 UTC | |
by I0 (Priest) on Mar 16, 2002 at 18:46 UTC |