use File::Slurp 'read_file'; my $template = read_file($template_name); 1 while $template =~ s/\[%\s*INCLUDE\s(.*?)\s*%\]/read_file($1)/msge; print $template;