Matti Maekitalo: Ersetzen

Beitrag lesen

use Mosche;

Den Tip mit CGI hast du bereits bekommen, vielleicht hier einige Verbesserungen:

Gerade wenn du sehr viele Template-Parameter hast, wird dein Quellcode sehr unübersichtlich. Verwende dann besser einen Hash.
Lasse alle Parameter, die du bekommst (also zB /cgi-bin/dein_cgi.pl?alias=blah) mit einem fest definierten Wert beginnen:
/cgi-bin/dein_cgi.pl?t_alias=blah&t_name=daniel&...

Dann füllst du einen Hash mit deinen Template-Parametern:
my $prefix = 't_'; # der Prefix, den du deinen Parametern gibst (um sie von nicht Template-Parametern zu unterscheiden.

my %hash = map { ($_ =~ /^$prefix/) ? (substr($_, length($prefix)), param($_)) : ()} param();

Das sieht ziemlich kompliziert aus, deswegen erkläre ich es hier ausführlich:

Die Funktion map ist etwas ähnliches wie eine for-Schleife, nur das sie eine Liste als Parameter erhält und auch eine zurückgibt. Der Code sieht in der Langform so aus

my $prefix = 't_';
my %hash;
foreach (param()) {

diese Schleife läuft über alle Parameternamen,

die dein Script bekommt

if (/^$prefix/){
   # das if prüft hier, ob der aktuelle Parametername
   # wirklich mit deinem Prefix beginnt (und damit zu
   # deinen Template-Variablen gehört)

# jetzt schneiden wir das Prefix ab
   my $name = substr($_, length(%prefix));

# und jetzt fügen wir den Template- Parameter mit
   # Wert in den Hash ein
   $hash{$name} = param($_);
   }
}

Wenn du das hast, kannst du deine Template-ersetzung vereinfachen:

open FILE,"<t_artikel.htm" or die "artikel.htm: $!";

print header();

Ich sehe, dass du bereits das CGI-Modul benutzt, deswegen vergiss nicht, auch die Funktion param() zu importieren (ist bereits getan, wenn du das Symbol ':standard' importierst.

Wenn du sowieso alle Zeilen gleich danach ausgibst, spar dir den Umweg, die Datei zeilenweise einzulesen:

$/ = undef;

my $file = <FH>;
$file =~ s/[(.*?)]/$hash{$1}/g;
print $file;

Dann brauchst du die Schleife nicht mehr.

close FILE;

Wenn du Standard-werte setzen willst, solltest du diese vor dem Auslesen der Parameter in den Hash einfügen.

Hier nochmals die komplette Datei (ausgetestet):
########################
#!/usr/bin/perl -w

use strict;
use CGI qw(param header);

print header();

my $tmpl_prefix = 't_';
my $tmpl_file  = '/web/test/htdocs/template.html';
my %tmpl_values = map { ($_ =~ /^$tmpl_prefix/) ? (substr($_, length($tmpl_prefix)), param($_)) : ()} param();

$/ = undef;
open(FH, $tmpl_file) or die "Kann $tmpl_file nicht öffnen: $!";

Datei einlesen

my $file = <FH>;

Template-Parameter ersetzen

$file =~ s/[(.*?)]/$tmpl_values{$1}/g;

Datei ausgeben

print $file;

close(FH);

###########################

Ich hoffe, du kannst damit etwas anfangen...

use Tschoe qw(Matti);