roman lenz: string printen der einen string enthält

hi hi,

ich will meinen html-Code vom perl-Code trennen und habe mir folgendes ausgedacht. Mein html-code steht in einem html-templet. dieses Templt lese ich per Perl ein und ersetze den Konstrukt <!-- $string --> durch $string und printe dann die ganze Zeile an den Browser. In meinem Beisp. zeigt der Browser mir "$welt" an und nicht "Hallo Welt".
In dem String $_ steckt ja noch der String $welt und wird nicht umgesetzt. Ich habe schon was rum probiert aber ich bekomme es nicht hin.

Was muss ich machen damit der zweite String auch umgesetzt wird?

besten Dank und einen schönen Abend noch

bis bis roman

perl:

#!D:\Perl\bin\perl.exe
use strict;
use CGI qw(:standard);
use CGI::Carp qw(fatalsToBrowser);

my $welt="Hallo Welt";

my $cgi = new CGI; # neues Objekt erstellen
print $cgi->header(-type => 'text/html');
open (DAT,'< test_templ.html');
  while (<DAT>) {
  s/<!-- ([$@&%]{1}.+?) -->/$1/g;
  print;
}

html:

<html>
<head>
  <title></title>
  <meta http-equiv="content-type"
 content="text/html; charset=ISO-8859-1">
</head>
<body>
<!-- $welt -->
<br>
</body>
</html>

P.S. ich hofe es sint kein rechtschreibvehler in meinem posting

  1. Hallo,

    ich mach das so:

    open(FILE,"$cgipfad/templates/output.html");
    foreach $out (<FILE>){
    $out =~ s/<%%navilinks%%>/$navigationslinks/g;
    $out =~ s/<%%htmlverz%%>/$htmlverz/g;
    $ausgabe .= $out;
    }
    close(FILE);
    print $ausgabe;

    im Template steht dann an den nötigen Stellen <%%navilinks%%> ...

    Cu Helmut

  2. Hi,

    vielleicht geht's so:

    s/<!-- ([$@&%]{1}.+?) -->/$1/g;

    $_ =~ s/<!-- ([$@&%]{1}.+?) -->/$1/g;
    print "$_";

    Viele Grüße
    Torsten

  3. hi roman!

    bei mir klappt das:

    open(DAT,'<template.htm');
     my @lines=<DAT>;
     foreach(@lines){
      while($_=~/<!-- ([$@&%].+?) -->/){$_=$`.eval($1).$'};
      print;
     }
    close(DAT);

    mehr zu regexp:
    http://www.perldoc.com/perl5.8.0/pod/perlretut.html#Extracting-matches

    prost
    seth

  4. #!D:\Perl\bin\perl.exe
    use strict;
    use CGI qw(:standard);
    use CGI::Carp qw(fatalsToBrowser);

    my $welt="Hallo Welt";

    my $cgi = new CGI; # neues Objekt erstellen
    print $cgi->header(-type => 'text/html');
    open (DAT,'< test_templ.html');
      while (<DAT>) {
      s/<!-- ([$@&%]{1}.+?) -->/$1/g;
      print;
    }

    html:

    <html>
    <head>
      <title></title>
      <meta http-equiv="content-type"
    content="text/html; charset=ISO-8859-1">
    </head>
    <body>
    <!-- $welt -->
    <br>
    </body>
    </html>

    und für das alles gibt es ein schönes Modul, das auch funktioniert und nicht die Fehler macht, die du machst und noch machen wirst. Danbene bietet es eine Fülle von Zusätzlichen Funktionen, wie Schleifen.

    Schau dir mal die Doku zu HTML::Template an.

    oder eine einfache Variante:

    my $welt="Hallo Welt";
    my $cgi = new CGI; # neues Objekt erstellen
    print $cgi->header(-type => 'text/html');

    print parse_html_file('test_templ.html',
    {
       welt => 'Hallo'
    }
    );

    sub parse_html_file
    {
        my $file = shift;
        my $vars = shift || die "Keine Parameter";

    open FILE, $file or die "Kann $file nicht öffnen. $!";
        local undef $/;
        my $file = <FILE>;
        close FILE;

    my @felder = $file =~ /<!--%([^%]+)%-->/gi;

    for(@felder)
        {
           $_ = uc $_;
           $vars->{$_} = "" unless defined $vars->{$_};
        }

    $file =~ s/<!--%([^%]+)%-->/$vars->{$1}/gi;

    return $file;
    }

    <html><head>
    <title></title>
    <meta http-equiv="content-type"
    content="text/html; charset=ISO-8859-1">
    </head>
    <body>
    <!--%welt%-->
    </body></html>

    Struppi.

    1. hi Struppi

      ich habe es geahnt :-(( ich wollte eigendlich um diese module herrun kommen (weil ich das mit den hash noch nicht so richtig gerafft habe).

      benutzt du HTML::Templet oder HTML::embperl?
      wie sind deine erfahrungen mit diesen modulen?

      besten dank

      bis bis roman

      1. hi Struppi

        ich habe es geahnt :-(( ich wollte eigendlich um diese module herrun kommen (weil ich das mit den hash noch nicht so richtig gerafft habe).

        Oh, eine der großen Stärken von Perl. Du kannst dir einen Haufen Code ersparen mit dem Sinnvollen Einsatz van hashes.

        benutzt du HTML::Templet oder HTML::embperl?
        wie sind deine erfahrungen mit diesen modulen?

        HTML::Template

        Das Modul ist sehr mächtig und vielseitig.
        Deshalb benutzte ich für einfache Sachen, wenn es nur darum geht 2 oder 3 Bereiche in die Seite einzubauen, die Funktion (bzw. eine etwas erweiterte Version davon).

        Allerdings bin ich von dem Gebrauch von so was prinzipiell etwas abgekommen, da ich, wenn schon dynamische Seiten, dann zu 90% dynamische Seiten mache und in Verbindung mit viel CSS sind Templates dann nicht mehr sinnvoll.

        Struppi.