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;