#!/usr/bin/perl
use strict;
use warnings;
# Template-Datei (Quick & Dirty)
my $template = '
[% loop $story %]
[% $story_title %]
[% $story_content %]
[% end %]
';
# Name der Loop
my $loop_name = "story";
# Array mit Hashes
my @array = (
{
story_title => "Erste Überschrift",
story_content => "Erster Inhalt",
},
{
story_title => "Zweite Überschrift",
story_content => "Zweiter Inhalt",
},
);
local ($1, $2, $3);
# Nach Loop-Muster suchen...
$template =~ m/
\[% \s* loop \s* \$ (\S+?) \s* %\] # [% loop $string %]
(.*?) # $loop_content
\[% \s* end \s* %\] # [% end %]
/xms;
my $loop_content = $2 if $1 eq $loop_name; # Inhalt der Loop (zwischen den Tags)
my $result;
for my $hash_ref ( @array ) { # Hashes aus dem Array rausholen
my $temp = $loop_content; # Loop-Inhalt zwischenspeichern
for my $key ( keys %{$hash_ref} ) { # Keys der Hashes durchgehen
$temp =~ s/
\[% \s* \$ (\S+?) \s* %\] # Nach [% $string %] suchen
/ # Ersetzen, falls im Hash vorhanden
$hash_ref->{$1} if exists $hash_ref->{$1}
/exms;
}
$result .= $temp;
}
# Die Loop im Template durch die geparste Loop ersetzen...
$template =~ s/
\[% \s* loop \s* \$ (\S+?) \s* %\]
(.*?)
\[% \s* end \s* %\]
/
$result
/xms;
print $template;