use File::Slurp ; #use Data::Dumper ; my %templates ; sub expand_template { my( $template, $params ) = @_ ; 1 while ( $template =~ s{<%INCLUDE\s+(\w+)\s*%>} { get_template($1)}e ) ; $template =~ s{<%CHUNK_(\w+)%>(.+?)<%END_\1%>} { ref $params eq 'HASH' ? expand_template_chunk( $2, $params, $1 ) : expand_template_list( $2, $params ) ; }sgex ; #print "CHUNK1 $template", Dumper $params ; if ( ref $params eq 'HASH' ) { $template =~ s{<%(\w+)%>} { defined $params->{$1} ? $params->{$1} : '' }ge ; } #print "CHUNK2 $template" ; return $template ; } sub expand_template_chunk { my( $template, $params, $chunk_name ) = @_ ; my $chunk_params = $params->{ $chunk_name } ; return '' unless $chunk_params ; return expand_template_list( $template, $chunk_params ) if ref $chunk_params eq 'ARRAY' ; #print "CHUNK3 $template", Dumper $params ; return expand_template( $template, $chunk_params ) ; } sub expand_template_list { my( $template, $list ) = @_ ; return join '', map expand_template( $template, $_ ), @{$list} ; } sub get_template { my( $tmpl_name ) = @_ ; return( $templates{ $tmpl_name } ||= read_file( "templates/$_.tmpl" ) ) ; } sub load_templates { my( @tmpl_names ) = @_ ; my %tmpls = map { $_, scalar read_file( "templates/$_.tmpl" ) } @tmpl_names ; return \%tmpls ; } 1 ;