use strict; use warnings; use feature 'say'; use Unicode::Collate; use charnames ''; my $punctuation_order = ' .,-;:!?"\'`_#$%&*+/|=@\^~()<>[]{}'; my $weight_base = 0x101; my $collator = Unicode::Collate-> new( upper_before_lower => 1, variable => 'non-ignorable', entry => join '', map { sprintf "%04X ; [*%04X.0020.0002.%04X] # %s\n", ord, $weight_base ++, ord, charnames::viacode( ord ) } split '', $punctuation_order ); my @list = qw{ }; # skipped say for $collator-> sort( @list );