Thread Trennung von Layout und Inhalt?
(4 answers)
Opened by umbrella at 2009-09-02 00:09
Ich würde "use" bevorzugen.
Bei "do" wird der Perl-Parser jedes mal angeworfen, wenn man "do" ausführt. Dein Code gut. Geht aber besser ( alles geht besser :-) ) Ganz davon ab das es gute Templatesysteme gibt, würde ich ihn Objektorientiert schreiben. Wenn du genau hinschaust wirst du sehen wo ich Änderungen an deinem Code gemacht habe. Vor allem das das Lesen der Datei betrifft und auch bei der Regexp. script.pl 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 #!/usr/bin/perl use strict; use warnings; use CGI; use CGI::Carp qw(fatalsToBrowser warningsToBrowser); use lib '/var/www/cgi-bin/newtest'; use template; my $vorlage = "test.tmpl"; my $data={}; my $cgi = CGI->new(); # ein Templateobjekt erzeugen. # der Vorteil ist, # wenn das Templatesystem komplexer wird, # kann man Problemlos mehrere Instanzen nebeneinander nutzen. my $template=template->new(); # abbruch wenn das template nicht geladen werden konnte die "Error Read Templatefile ($!)" if(!$template->read($vorlage)); $data->{'print'} = 'Das ist ein test!'; # HTTP-Header Ausgeben print $cgi->header(); # Warnungen im Browser ausgeben. # sonst nützt das "use warnings" nicht so viel, # da die Meldungen sonst nur im Errorlog des Webservers landen warningsToBrowser(1); # Das print nicht im templatesystem. # Eventuell sollen die Generierten Daten noch nacharbeitetet werden. # (z.B dienen als Daten für ein weiteres Template) print $template->render($data); template.pm 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 package template; use strict; use warnings; sub new { my $class=shift; my $self={}; # hier wird das Template gespeichert $self->{template}=''; # wir machen aus dem Paket (Klasse) ein Objekt bless($self,$class); return $self; } sub read { # objekt übernehmen my $self=shift; # dateiname übernehmen my $file=shift; # ganze Datei einlesen # da Inputseparator undef local $/=undef; # Fehler beim öffnen der Datei -> abbruch return 0 if(!open(my $fh, '<', $file)); # man braucht kein sysopen um eine Datei nur lesend zu öffnen # alles einlesen $self->{template}=<$fh>; close($fh); return 1; } sub render { my $self=shift; my $data=shift; # kein Hash -> abbruch return '' if(!ref($data) eq 'HASH'); my $output=$self->{template}; # "\w" findet alle alphanumerischen Zeichen "[A-Za-z0-9]" $output=~ s/<-html_(\w+)->/$data->{lc($1)}/gsx; # gerenderter Text zurück return $output; } 1; EDIT: Die "1;" am Ende des Moduls vergessen. Sonst weiß perl nicht, dass das Laden erfolgreich war. Last edited: 2009-09-02 11:58:30 +0200 (CEST) |