ken@titan ~/tmp/pm_11155205_uni_char_class
$ ls -l *2*
-rw-r--r-- 1 ken None 1275 Oct 29 01:50 PolyUniCharClass2.pm
-rwxr-xr-x 1 ken None 370 Oct 29 01:42 uni_char_class_2.pl
####
#!/usr/bin/env perl
use strict;
use warnings;
use open OUT => qw{:encoding(UTF-8) :std};
use lib '.'; # DEMO ONLY -- DON'T use in PRODUCTION!
use PolyUniCharClass2;
for my $prefix (qw{In Is If}) {
for my $class (qw{H L M}) {
my $cons = "${prefix}Thai${class}Cons";
print "$cons:\n";
print @{PolyUniCharClass2::list($cons)}, "\n";
}
}
####
package PolyUniCharClass2;
use strict;
use warnings;
{
my %char_class_despatch = (
InThaiHCons => \&InThaiHCons,
InThaiLCons => \&InThaiLCons,
IsThaiHCons => \&InThaiHCons,
IsThaiLCons => \&InThaiLCons,
);
sub list {
my ($char_class) = @_;
unless (exists $char_class_despatch{$char_class}) {
warn "Char class '$char_class' doesn't exist!\n";
return [];
}
return [map chr, @{$char_class_despatch{$char_class}->()}];
}
}
{
my $ThaiHCons = [qw{0E02-0E03 0E09 0E10 0E16}];
my $ThaiLCons = [qw{0E04-0E07 0E0A-0E0D 0E11}];
my %ThaiCons_expanded;
sub InThaiHCons {
return $ThaiCons_expanded{InThaiHCons} ||= _expand($ThaiHCons);
}
sub InThaiLCons {
return $ThaiCons_expanded{InThaiLCons} ||= _expand($ThaiLCons);
}
}
{
my $re = qr{^([0-9A-Fa-f]+)-([0-9A-Fa-f]+)$};
sub _expand {
my ($code_range_list) = @_;
my @full_list;
for my $range (@$code_range_list) {
if ($range =~ $re) {
push @full_list, hex($1) .. hex($2);
}
else {
push @full_list, hex $range;
}
}
return [@full_list];
}
}
1;