Schrift
[thread]10[/thread]

HTML ausgabe mit variable: bekomm das nicht hin

Leser: 1


<< |< 1 2 >| >> 13 Einträge, 2 Seiten
Gast Gast
 2003-08-19 01:18
#16 #16
hallo,

ich gebe eine htmldatei (liegt in einer externen Datei) in meinem Perlskript wie folgt aus:
ich habe folgendes geschrieben:

# benötigte Seite einlesen
open(LISTE, "<$seite") || die "Datei mit Empfaengern nicht gefunden\n";
while(<LISTE>)
{
push(@Zeilen,$_);
}
close(LISTE);

# Seite ausgeben
print "Content-type: text/html\n\n";
foreach (@Zeilen)
{
print "$_";
}

ich möchte aber gern innerhalb von html sogenannte platzhalter setzen in Form von Variablen

das Skript soll erst berechnen, dann html ausgeben und die variablen natürlich ersetzen

Das ganze bitte ohne here Dokumente , html soll extern bleiben , geht dasohne grosse Änderungen?

Danke
SirLant
 2003-08-19 01:45
#17 #17
User since
2003-08-04
516 Artikel
BenutzerIn
[default_avatar]
Ja natürlich geht das, du musst dazu nur feste Platzhalter verwenden, z.B. <_Variable1> ,nun suchst du nach dieser Variablen innerhalb des Textes und ersetzt diese:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
open(LISTE, "<&#36seite") || die "Datei mit Empfaengern nicht gefunden\n";

undef &#36\; 
&#36liste = <LISTE>; #Liest die ganze Datei in den Skalar

&#36liste =~ s/<_Variable1>/&#36text/g; #ersetzt alle <_Variable1>-Tags durch &#36text, die in &#36liste vorkommen

print "Content-type: text/html\n\n";
print &#36liste;
\n\n

<!--EDIT|SirLant|1061243153-->
--Programming today is a race between Software Enginers striving to build bigger and better idiot-proof Programs,
and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
Dubu
 2003-08-19 01:48
#18 #18
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Erstmal etwas stilistisches:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# ersetze 
while(<LISTE>)
 {
  push(@Zeilen,&#36_);
 }
# durch
@Zeilen = <LISTE>;

# ersetze 
foreach (@Zeilen)
{
print "&#36_";
}
# durch
print @Zeilen;


Dann zu deiner Frage: Ja, natuerlich geht das. Du hast nach dem Einlesen den HTML-Code ja wohl in @Zeilen, darin kannst du dann deine Ersetzungen vornehmen. Damit du nicht in jeder einzelnen Zeile ersetzen musst, waere es dafuer aber praktischer, alles nur in einem String zu haben.

Fuer ein einfaches Templatesystem muss man sich erstmal eine Markierung ausdenken, die im Template die Variablen auszeichnet und die nicht zufaellig auch so im Template vorkommt. Als Beispiel nehme ich hier mal "%%Irgendwas%%" fuer eine Variable mit Namen "Irgendwas". Im Programm speichert man die Variablen der Einfachheit halber in einem Hash, dessen Schluessel die Namen sind.
Hier ein kleiner Beispielcode dafuer:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
my %TmplVariablen = (
    User  => "Niemand",
    Land  => "Takatukaland",
);

my &#36Text;
open (LISTE, "< &#36seite") or die "Datei &#36seite konnte nicht geoeffnet werden: &#36!";
{
    local &#36/;
    &#36Text = <LISTE>;
}
close LISTE;

# Hier werden die Variablen ersetzt
&#36Text =~ s/%%(\w+)%%/exists &#36TmplVariablen{&#361} ? &#36TmplVariablen{&#36_} : ""/eg;

print "Content-type: text/html\n\n";
print &#36Text;
(ungetestet)

Dabei wuerde jetzt der Text
Ich bin <b>%%User%%</b> und wohne in %%Land%%.
ersetzt durch
Ich bin <b>Niemand</b> und wohne in Takatukaland.


Fuer solche Templates gibt es aber schon sehr schoene Loesungen auf CPAN, wie z.B. CPAN:HTML::Template oder - richtig ausgefeilt - CPAN:HTML::Mason oder gar CPAN:HTML::Embperl.
SirLant
 2003-08-19 02:09
#19 #19
User since
2003-08-04
516 Artikel
BenutzerIn
[default_avatar]
local $/; , fehlt da nicht noch nen undef danach?
--Programming today is a race between Software Enginers striving to build bigger and better idiot-proof Programs,
and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
pq
 2003-08-19 02:18
#20 #20
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=SirLant,19.08.2003, 00:09]local $/; , fehlt da nicht noch nen undef danach?[/quote]
nein, wird automatisch auf undef gesetzt. geht aber nicht wirklich
aus der doku hervor, muss ich zugeben. oder überseh ich was?
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
SirLant
 2003-08-19 02:23
#21 #21
User since
2003-08-04
516 Artikel
BenutzerIn
[default_avatar]
Ne du hast meine Frage schon vollkommen richtig verstanden und beantwortet :)
--Programming today is a race between Software Enginers striving to build bigger and better idiot-proof Programs,
and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
pq
 2003-08-19 02:31
#22 #22
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=SirLant,19.08.2003, 00:23]Ne du hast meine Frage schon vollkommen richtig verstanden und beantwortet :)[/quote]
nee, ich meinte, ob ich was an der doku übersehe... =)
da kann ich das
nirgends finden...

Edit: auszug aus perlsub, abschnitt Temporary Values via local():
" (If no initializer is given for a particular variable, it is cre-
    ated with an undefined value.)
"
naja, lesen müsste man können\n\n

<!--EDIT|pq|1061251468-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
format_c
 2003-08-19 02:36
#23 #23
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
machts euch doch nicht so schwer... ;)

Da hat sich schon mal ein den Kopf drüber zerbrochen.
perldoc HTML::Template

Im HTML-Template die Platzhalter wie folgt:
[html]
<TMPL_VAR name="CONTENT">
[/html]

so sieht das dann in perl aus:
Code (perl): (dl )
1
2
3
4
5
use HTML::Template;
my &#36tmpl = HTML::Template->new(filename =>'path/to/file.html');
&#36tmpl->param('CONTENT' => &#36inhalt);
print "Content-type: text/html\n\n";
print &#36tmpl->output();


Gruß Alex\n\n

<!--EDIT|format_c|1061246425-->
SirLant
 2003-08-19 02:50
#24 #24
User since
2003-08-04
516 Artikel
BenutzerIn
[default_avatar]
Kann man HTML::Template so umstellen, dass man Variablen mit %%Name%% schreibt?Und kann man dort auch Code reinschreiben, so wie bei Mason?
Für Mason braucht man ja mod_perl, afaik.

Nen richtiges System sieht nämlich so aus:
Programm holt Daten und verarbeitet diese, Template System, erzeugt den HTMl-Code und ist für die Formatierung zuständig, so hat man ne strikte Trennung, mit Mason ja kein Problem, nur wie gesagt afaik braucht das ja mod_perl
--Programming today is a race between Software Enginers striving to build bigger and better idiot-proof Programs,
and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
Relais
 2003-08-19 02:53
#25 #25
User since
2003-08-06
2246 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=format_c,19.08.2003, 00:36]perldoc HTML::Template[/quote]
meinst Du <!--pod1--><a href="http://www.perldoc.com/perl5.8.0/pod/html::templat..." target="_blank">perldoc <!--pod2-->HTML::Template<!--pod3--></a><!--pod4--> oder CPAN:HTML::Template? 8)

Edit: Ui, Bug, ersteres funktioniert nicht!\n\n

<!--EDIT|Relais|1061247287-->
Erst denken, dann posten --
27. Deutscher Perl- u. Raku -Workshop (Termin wird noch gesucht) 2025 in München.

Winter is Coming
<< |< 1 2 >| >> 13 Einträge, 2 Seiten



View all threads created 2003-08-19 01:18.