Thread Mein bisher kürzestes CGI-Script (27 answers)
Opened by rosti at 2011-08-11 19:25

rosti
 2011-08-27 07:30
#151851 #151851
User since
2011-03-19
3180 Artikel
BenutzerIn
[Homepage]
user image
2011-08-11T18:16:41 pq
das templating gefällt mir gar nicht. ist vermutlich sehr aufwendig zu warten, da man im template nur %s stehen hat und im code nach der reihenfolge schauen muss.
wenn dann würde ich gleich mit einem fertigen template-system arbeiten.


Nur keinen Schnellschuss ;)

Das gute alte sprintf() hat den Vorteil, dass es unabhängig von der Zeichenkodierung die Platzhalter ersetzt und so habe ich das gestern abend ein bischen weiterentwickelt, dahingehend, dass die Platzhalter sprechende Namen bekommen. Im Prinzip geht das so:

Namentliche Platzhalter wie %name, %vorname, %plz, %ort usw. werden im ersten Schritt gegen %s ausgetauscht, gleichzeitig wird ein Array [name, vorname, plz, ort, ...] geschrieben, damit die Reihenfolge der Platzhalter nicht verlorengeht.

Das Platzhalter-Objekt ist wie gehabt ein Hash mit Platzhalter => Werte Paaren. Im zweiten Schritt wird über das Array mit den Platzhalternamen iteriert und im Fall, dass es einen zugehörigen Wert gibt, dieser ausgetauscht. Im dritten Schritt: sprintf, fertig. Probiers aus ;-)

Code (perl): (dl )
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
package TemplateSimple;

###########################################################################
# Einfaches Template-System
# Arbeitet unabhängig von der Zeichenkodierung (UTF-8, ISO...)
# Rolf Rost, 26.8.2011
###########################################################################
use strict;
use warnings;
use Carp;

sub new{
        my $class = shift;
        my $template = shift;   
        my $templval = shift;
        
        croak qq(Erstes Argument muss sein: Scalar-Referenz auf Template) if ref $template ne 'SCALAR';
        croak qq(Zweites Argument muss sein: Hash-Referenz mit Werten) if ref $templval ne 'HASH';
        
        my $self = {
                TEMPLATE => $template,
                TEMPLVAL => $templval,
                TEMPLIST => [],
        };
        return bless $self, $class;
}

sub expand{
        my $self = shift;
        
        # Liste der Platzhalter namentlich ermitteln
        # Platzhalter gegen %s austauschen
        ${$self->{TEMPLATE}} =~ s/%(\w+)/$self->_xp($1)/eg;

        # Platzhalter werden nun gegen die Werte ausgetauscht
        foreach my $s(@{$self->{TEMPLIST}}){
                $s = defined $self->{TEMPLVAL}{$s} ? $self->{TEMPLVAL}{$s} : '';                        
        }
        ${$self->{TEMPLATE}} = sprintf ${$self->{TEMPLATE}}, @{$self->{TEMPLIST}};
}

# Platzhalter gegen %s austauschen
# Array TEMPLIST mit Namen der Platzhalter
sub _xp{
        my $self = shift;
        my $s = shift;
        push @{$self->{TEMPLIST}}, $s;
        return '%s';
}

1;#########################################################################

package main;

use strict;
use warnings;

my $template = qq(
        Vorname: %vorname
        Name: %name
        Ort: %ort
        PLZ: %plz
);

my $templval = {
        name => "Rost",
        vorname => 'Rolf',
        ort => 'Oppenheim',
        plz => '55276',
};


my $ts = TemplateSimple->new(\$template, $templval);
$ts->expand;

print $template;

View full thread Mein bisher kürzestes CGI-Script