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;