Thread Mein bisher kürzestes CGI-Script
(27 answers)
Opened by rosti at 2011-08-11 19:25 2011-08-11T18:16:41 pq 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; |