my $code = join('', 'push @{$data', (map { $_-=97; "[$_]"} sort{$a<=>$b} unpack 'C*', $_), "[26]}, '$_';");
####
# split and sort
art => push @{$data{a}{r}{t}{words}}, 'art';
rat => push @{$data{a}{r}{t}{words}}, 'rat';
tar => push @{$data{a}{r}{t}{words}}, 'tar';
####
aeinrst => (
$data->{a}, einrst
$data->{e}, inrst
$data->{i}, nrst
$data->{n}, rst
$data->{r}, st
)
####
my $item = pop @work;
my ($tree, $str) = @$item; # $data->{a}, einrst
push @work, [$data->{a}{e}, 'inrst'] if $data->{a}{e};
push @work, [$data->{a}{i}, 'nrst'] if $data->{a}{i};
push @work, [$data->{a}{n}, 'rst'] if $data->{a}{n};
push @work, [$data->{a}{r}, 'st'] if $data->{a}{r};
push @work, [$data->{a}{s}, 't'] if $data->{a}{s};
push @work, [$data->{a}{t}, ''] if $data->{a}{t};