#!/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)
In reply to Re: Inconsistent column Schwartzian Transform attempt
by RMGir
in thread Inconsistent column Schwartzian Transform attempt
by gryphon
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |