Строку, которая должна соответствовать шаблону, см. в самом коде:
my %p=('('=>')','{'=>'}');
my $a='fg{}hg ( (gh{jkjk} (h) g (llh) ) ( (jkj) (k(l h{} jhjhj )k) k) kkk) jkjkj (aaa)';
print "hello\n"
if $a=~m/^((?>[^({})]*)(?:([({])(?-2)(??{ '\'.$p{$2} })(?>[^({})]*))*)$/;
Вопрос: работает-то оно работает, но можно ли было проще сделать?