Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

Re: Changing ASCII collating sequence for sort

by johngg (Canon)
on Apr 18, 2022 at 10:14 UTC ( #11143049=note: print w/replies, xml ) Need Help??


in reply to Changing ASCII collating sequence for sort

Rather than using transliteration you could employ look-ups and a GRT sort.

use strict; use warnings; use feature qw{ say }; my $intended = <<'EOF'; .,-;:!?"'`_#$%&*+/|=@\^~()<>[]{}0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmN +nOoPpQqRrSsTtUuVvWwXxYyZz EOF chomp $intended; my $seq = 0; my %sortLU = map { $_ => sprintf q{%02d}, $seq ++ } split m{}, $intend +ed; my %revLU = reverse %sortLU; my @list = qw{ "Hello" Abel (hello) {adieu} @adieu [goodbye] Charlie ^Charlie ~Adieu zebra 21708 baker . - ; : ! ? " ' ` _ }; push @list, q{ first}; say for map { join q{}, map { $revLU{ $_ } } unpack q{(a2)*}, $_ } sort map { join q{}, map { $sortLU{ $_ } } split m{}, $_ } @list;

The output

first . - ; : ! ? " "Hello" ' ` _ @adieu ^Charlie ~Adieu (hello) [goodbye] {adieu} 21708 Abel baker Charlie zebra

I hope this is useful.

Update: I mistakenly omitted the space character from the start of the sort order string. Now corrected with an additional item " first" to check that spaces are sorted correctly.

Cheers,

JohnGG

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://11143049]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (5)
As of 2023-02-01 12:57 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    I prefer not to run the latest version of Perl because:







    Results (3 votes). Check out past polls.

    Notices?