Schrift
[thread]66[/thread]

Perl hängt sich mal wieder auf: bei ersetzen in einem Template



<< >> 8 Einträge, 1 Seite
pktm
 2003-10-18 20:25
#6292 #6292
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Hallo!
Hier mal wieder was freudiges von mir:
Perl hängt sich auf und es kann eigentlich nurncoh an der Subroutine liegen, die ich immer zum ersetzen in Templates verwende.
Das Problem trat nämlich auch in anderen Projekten bei immer der selben Aktion auf.
Die Sub sieht so aus:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sub substitute{
# ---- usage
# my @substitutedFile = substitute( @contentToSubstitute ); # substitute-keywords must be added to %subs (global %hash)
my @err = (); # array für fehler
my @file = @_;
foreach my $eintrag( @file ){
if( $eintrag =~ /\%\%(.*)\%\%/ ){
my $keyword = $1;
unless( exists $subs{$keyword} ){ push @err, "Wert nicht gesetzt: $keyword\n"; $subs{$keyword} = ""; }
unless( $eintrag =~ s/$&/$subs{$keyword}/g ){ print STDERR "Fehler beim ersetzen!\n"; }
print STDERR "ersetzte: $& mit $eintrag\n";
}
}
print STDERR @err;
return @file;
} #substitute

Der Aufruf erfolgt z.B. ao:
Code: (dl )
print substitute( extractFile( $tmplDir . '/template.html' ) ); #extractFile liefert den Inhalt einer Datei als Array zurück


So, um dieses Problem jetzt ein für allemal aus der Welt zu schaffen, weil es mich echt ankotzt, dass ich perl immer über den Taskmanager beenden muss um damit ich zu meiner Augabe komme dachte ich mir, schreiben wir diese Funktion einfach mal neu.
Schön geordnet, ohne Ausgabe der Fehler in den STDERR und ohne Verwendung der Variablen $&.
Wer gibt mir einen Vorschlag?
mfg pktm
PS: Ist es eiegtlich möglich mit wenig Aufwand ein Script nach x Sekunden terminieren zu lassen?
Wenn ja bitte mal per PM mitteilen, ich könnte sowas BEI DER ENTWICKLUNG (keine Angst :) ) gut gebrauchen.
http://www.intergastro-service.de (mein erstes CMS :) )
jan
 2003-10-18 20:31
#6293 #6293
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
du liest die datei ein:
my $filecontent;

open(DATEI, "meinedatei.txt") || die "Konnte Datei meinedatei.txt nicht öffnen: $!";
{
local $/;
$filecontetn = <DATEI>;
}
close(DATEI);

und dann hast du deinen hash mit den keyword => wert zuordnungen und ersetzt entsprechend. ich nehme als platzhalter in dateien gerne &{name}
$filecontent =~ s/&\{([^\}]+)\}/exist $replace{$1} ? $replace{$1} : ""/egs;
wie strat es schon mal postete. das sollte reichen. ist jetzt ungetestet, aber mit etwas glück klappts auf anhieb ;)
pktm
 2003-10-18 21:26
#6294 #6294
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Also meinedatei.txt ist das Main-Template und die PLatzhalter, die ich mit %%platzhalter%% eingrenze werden mit &{platzhalter} definiert? Nur als Sicherheitsfrage :)
mfg pktm
http://www.intergastro-service.de (mein erstes CMS :) )
jan
 2003-10-18 21:44
#6295 #6295
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
ja, so hab ich das gerade gedacht. aber kannst die dateinamen und das format der platzhalter natürlich auch nach belieben ändern...
pktm
 2003-10-18 21:49
#6296 #6296
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Nö, das Format gefällt mirnganz gut, bei meinem gibts nämlich das Problem, dass nur ein Platzhalter in einer Zeile stehe kann, weil Start & Ende des Pattern gleich aussehen.
Ich habe nur im MOment Probelme damit die RegEx zu lesen:
Code: (dl )
$filecontent =~ s/&\{([^\}]+)\}/exist $subs{$1} ? $subs{$1} : ""/egs;

Kann man das irgendwie in if-else-Verzweigungen umbauen, damit ich das raffe?
Ich erhalte nämlich den Fehler
Quote
syntax error at c:\apache\cgi-bin\cms\gcp\CMSADM~1.CGI line 300, near "$subs{"
Search pattern not terminated at c:\apache\cgi-bin\cms\gcp\CMSADM~1.CGI line 300.

und weis sicht, was ich machen soll.
Bei mir sieht das Pattern nämlich geschlossen aus.
mfg pktm
http://www.intergastro-service.de (mein erstes CMS :) )
jan
 2003-10-18 21:52
#6297 #6297
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
sorry, mein fehler. änder einfach exist $subs{$1} in exists $subs{$1} ... das s muss natürlich dabei sein ... flüchtigkeitsfehler sind die schlimmsten ;)
pktm
 2003-10-18 22:59
#6298 #6298
User since
2003-08-07
2921 Artikel
BenutzerIn
[Homepage]
user image
Dough - hätte ich doch sehen müssen :0
Naja, jetzt geht es auf jeden Fall ohne, dass sich mein Scriptz aufhängt.
Vielen vielen Dank!
Mir graut es schon davor die anderen Großen Projekte umzustellen :D
mfg pktm
http://www.intergastro-service.de (mein erstes CMS :) )
Strat
 2003-10-19 03:13
#6299 #6299
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
und die gleich auf HTML::Template oder so umstellen?
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
<< >> 8 Einträge, 1 Seite



View all threads created 2003-10-18 20:25.