Hallo Community,
nachfolgender Perl-Code soll in einem String nach dem folgenden Muster suchen
[% loop $story %]
<div class="story">
<h2 class="title">[% $story_title %]</h2>
<div class="content">
[% $story_content %]
</div>
</div>
[% end %]
und
[% $story_title %] sowie
[% $story_content %] wiederholt ersetzen (als Schleife).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#!/usr/bin/perl
use strict;
use warnings;
# Template-Datei (Quick & Dirty)
my $template = '
<html>
<body>
<div id="content">
[% loop $story %]
<div class="story">
<h2 class="title">[% $story_title %]</h2>
<div class="content">
[% $story_content %]
</div>
</div>
[% end %]
</div>
</body>
</html>
';
# 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;
Funktioniert alles einwandfrei, nur sieht es potthässlich aus. Besteht die Möglichkeit, die einzelnen RegEx'es in einen einzigen RegEx zu hauen oder den Code zumindest zu vereinfachen?
(Und ja, ich bin ein Esel, weil ich kein CPAN-Modul nutze :laugh: )