use Parse::RecDescent (); my $word = 'abbreviation'; my $c = 1; my $word_rule = join '', map { my $d = $c++; "L$d: '$_' L$c(?)\n" } split //, $word; my $grammar = "m: L1 /\\Z/ {1}\n${word_rule}L$c:\n"; my $p = Parse::RecDescent->new($grammar); if ($p->m('abb')) { print("yes\n"); } else { print("no\n"); }