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;