ralf: externe txt datei über variable einfügen

hallo forum,
für ein perlprogramm, in dem es um das bestellen bzw. abbestellen einen newsletters geht, würde ich gerne eine externe txt datei über eine variable in das perl script einfügen.

Hintergrund dafür ist, daß es eine vielzahl von if/else verzweigungen gibt, und ich das script heftig aufblähen würde, wenn ich jedesmal den kompletten html code in das script einfügen müßte.

Deshalb würde ich gerne die variable $header und $footer definieren, um dann bei den abfragen die variablen entsprechend einzufügen. Mir ist aber nicht klar, wie ich die variablen definieren muß, denn schließlich muß ich ja einen pfad zur txt datei angeben (liegt mit im cgi-bin)und wenn ich die variable über print $header ...
einfügen würde, würde das script ja den pfad ausgeben und nicht den inhalt der txt datei. Wäre nett, wenn mir jemand weiterhelfen könnte.

Ich hoffe, ich konnte verständlich ausdrücken, was ich meine.
Vielen dank für die hilfe
gruß ralf

  1. my $f = "the_file.txt";
    open(FH, "<$f") die;
    my $content = <FH>;
    close(FH);

    so aus'm Gedächtnis

    1. Auch meine Meinung.....

      Wenn man den Content wiederholt ausgibt z.b. in einem Gastbuch, würde
      ich noch die Ausgabe entpuffern :

      $=1;

      Somit werden die Ergebnisse schneller ausgeben.
      Das Script läuft aber dadurch nicht schneller !!!

      Man kann auch für 1 Script verschiedene Templates definieren und über die URL
      angeben, wenn man z.b. mit einem Script verschiedene Bereiche verarbeitet :

      /cgi-bin/meinscript.cgi?template=meintemplate.htm

      Dann mit CGi.pm einparsen.......

      #!/usr/bin/perl

      use CGI qw/:standard/;

      $query = new CGI;  
          @values = $query->param;

      nun folgende Zeile austauschen :

      my $f = "the_file.txt";

      gegen :

      my $f=param('template');

      somit kann man ein Ausgabetemplate per URL definieren.
      Mit Sicherheit nichts neues, aber auch eine Lösung, anderen
      zuhelfen.

      my $f = "the_file.txt";
      open(FH, "<$f") die;
      my $content = <FH>;
      close(FH);

      so aus'm Gedächtnis

      1. nun folgende Zeile austauschen :

        my $f = "the_file.txt";
        gegen :
        my $f=param('template');

        Mit Sicherheit nichts neues, aber auch eine Lösung, anderen

        .. aber mit Sicherheit unsicher! Wer einen Dateinamen vom CGI entgegennimmt, verdient es wohl nicht anders, als von bulgarischen IT-Experten den Datenbestand gelöscht zu bekommen ..

        1. nun folgende Zeile austauschen :

          my $f = "the_file.txt";
          gegen :
          my $f=param('template');

          Mit Sicherheit nichts neues, aber auch eine Lösung, anderen

          ist schon klar......aber war ja auch nur ein Lösungsansatz........so mache ich dies auch nicht....
          es ging mir nur um die generelle Frage.......

          Muss ja nicht jeder sehen, ok...........

          .. aber mit Sicherheit unsicher! Wer einen Dateinamen vom CGI entgegennimmt, verdient es wohl nicht anders, als von bulgarischen IT-Experten den Datenbestand gelöscht zu bekommen ..

          sinds nur die bulgaren oder auch andere :-)

          Andreas van Loock

          1. sinds nur die bulgaren oder auch andere :-)

            ich will hier nicht wegen rassistischer Äüßerungen geflagt werden <fear/>

            Bulgarische IT-ler stehen nun mal im Ruf, die erfolgreichsten Viren-Schreiber und die "aufgeschlossensten" Site Cracker zu sein. Getriggert wurde die Randbemerkung durch den Gag, daß sich auf die - imho blödsinnige - "GreenCard-Initiative" überwiegend Bulgaren gemeldet haben sollen

    2. hi!

      my $f = "the_file.txt";
      open(FH, "<$f") die;
      my $content = <FH>;
      close(FH);

      Falsch! Das liest nur die erste Zeile ein. <> gibt im skalaren Kontext die nächste Zeile, im Listenkontext
      alle Zeilen zurück. Richtig wäre also:
        open FH, "<$f" or die "$!";
        my @content = <FH>;
        close FH;

      @content kann dann entweder mit "print" unverändert ausgegeben werden, oder durch "join" zu einem
      einzigen Skalar verknüpft werden.

      so aus'm Gedächtnis

      Dann halt vorher ausprobieren oder nachschauen, wenn man sich nicht sicher ist.

      bye, Frank!

  2. hi. also ich würds ganz einfach so machen:

    open(DATEI,"<header_template.txt");
    @header = <DATEI>;
    close(DATEI);

    open(DATEI,"<footer_template.txt");
    @footer = <DATEI>;
    close(DATEI);

    dann noch zwei funktionen, eine &print_header() und eine &print_footer().
    print header sieht dann etwa so aus:

    sub print_header {
    for (@header) {
      # hier könntest du die zeilen noch irgendwie parsen, sehr nützlich für templates.
      print $_;
    }
    }
    die print_footer() dann natürlich so:
    sub print_footer {
    for (@footer) {
      # parsing blabla
      print $_;
    }
    }

    im script rufst du dann einfach &print_header() oder footer auf wann immer du sie brauchst.
    statt die templates in einer datei auszulagern kannst du natürlich auch alles gleich in die funktionen schreiben.
    z.b.
    sub print_footer {
    print <<END;
    <html>
    <head>
    blahblah
    </head>
    <body bgcolor=black text=white>
    END
    }

    das END darf dabei nicht eingerückt sein, da der << operator den endstring am anfang der zeile sucht.. (danach dürfen auch keine zeichen mehr kommen soweit ich weiß)

    ich hoffe das hilft dir weiter :)

    danny

    hallo forum,
    für ein perlprogramm, in dem es um das bestellen bzw. abbestellen einen newsletters geht, würde ich gerne eine externe txt datei über eine variable in das perl script einfügen.

    Hintergrund dafür ist, daß es eine vielzahl von if/else verzweigungen gibt, und ich das script heftig aufblähen würde, wenn ich jedesmal den kompletten html code in das script einfügen müßte.

    Deshalb würde ich gerne die variable $header und $footer definieren, um dann bei den abfragen die variablen entsprechend einzufügen. Mir ist aber nicht klar, wie ich die variablen definieren muß, denn schließlich muß ich ja einen pfad zur txt datei angeben (liegt mit im cgi-bin)und wenn ich die variable über print $header ...
    einfügen würde, würde das script ja den pfad ausgeben und nicht den inhalt der txt datei. Wäre nett, wenn mir jemand weiterhelfen könnte.

    Ich hoffe, ich konnte verständlich ausdrücken, was ich meine.
    Vielen dank für die hilfe
    gruß ralf

    1. yo.
      Vielen dank (an die anderen auch). Das hilft mir auf jeden fall weiter. Allerdings ist mir nicht ganz klar, wofür ich den oberen teil noch brauche. Wenn ich die funktion definiert habe, müßte doch eigentlich der aufruf durch print header/footer genügen, damit das ganze funzt. Wofür ist dann der folgende teil noch wichtig? Und wo füge ich den ein. Einfach vor der funktion? Oder ist egal wo?

      open(DATEI,"<header_template.txt");
      @header = <DATEI>;
      close(DATEI);

      open(DATEI,"<footer_template.txt");
      @footer = <DATEI>;
      close(DATEI);

      grüße
      ralf

      1. hi,

        Vielen dank (an die anderen auch). Das hilft mir auf jeden fall weiter. Allerdings ist mir nicht ganz klar, wofür ich den oberen teil noch brauche. Wenn ich die funktion definiert habe, müßte doch eigentlich der aufruf durch print header/footer genügen, damit das ganze funzt. Wofür ist dann der folgende teil noch wichtig? Und wo füge ich den ein. Einfach vor der funktion? Oder ist egal wo?
        open(DATEI,"<header_template.txt");
        @header = <DATEI>;
        close(DATEI);

        open(DATEI,"<footer_template.txt");
        @footer = <DATEI>;
        close(DATEI);

        also, das ist wichtig damit die dateien überhaupt eingelesen werden.
        die werden dann in die arrays @header und @footer gespeichert und diese arrays werden dann von den &print_xxxx() funktionen verwendet.
        wo du das hintust ist im prinzip egal. ich würde es ganz am anfang des scripts machen, wo du auch anderes globale variablen deklarierst.. (oder hieß es definiert? ne deklariert.. bin zu müde *g*)
        dann kommst du nicht durcheinander.
        es gibt sicher bessere lösungen als die arrays die ganze zeit im speicher zu behalten aber für dich ist es denke ich mal die einfachste und schnellste lösung.

        danny

        1. hi,

          Vielen dank (an die anderen auch). Das hilft mir auf jeden fall weiter. Allerdings ist mir nicht ganz klar, wofür ich den oberen teil noch brauche. Wenn ich die funktion definiert habe, müßte doch eigentlich der aufruf durch print header/footer genügen, damit das ganze funzt. Wofür ist dann der folgende teil noch wichtig? Und wo füge ich den ein. Einfach vor der funktion? Oder ist egal wo?
          open(DATEI,"<header_template.txt");
          @header = <DATEI>;
          close(DATEI);

          open(DATEI,"<footer_template.txt");
          @footer = <DATEI>;
          close(DATEI);

          also, das ist wichtig damit die dateien überhaupt eingelesen werden.
          die werden dann in die arrays @header und @footer gespeichert und diese arrays werden dann von den &print_xxxx() funktionen verwendet.
          wo du das hintust ist im prinzip egal. ich würde es ganz am anfang des scripts machen, wo du auch anderes globale variablen deklarierst.. (oder hieß es definiert? ne deklariert.. bin zu müde *g*)
          dann kommst du nicht durcheinander.
          es gibt sicher bessere lösungen als die arrays die ganze zeit im speicher zu behalten aber für dich ist es denke ich mal die einfachste und schnellste lösung.

          danny

        2. öha! Tut mir leid. Falsche taste erwischt.
          Also:
          Besten dank. Jetzt habe ich es verstanden. Ich wußte nicht, daß auf diese art und weise bei pearl arrays angelegt werden.
          gruß ralf