Christian: Inhalt einer Datei an Array/Varible übergeben

Hallo,

ich möchte in ein Perl-Script eine (php-) Datei so einfügen, dass diese hinterher in ein Template eingebunden wird. Dabei ist
meine Frage, wie ich es schaffe eine ganze Datei einem Array oder einer Variablen zuzuordnen.

Dazu soll in Perl die Datei mit

open (PHPHEAD, 'E:/PHP4/php.exe F:/includes/head.php|') || die 'kann phphead nicht einbinden';
  @phphead = <PHPHEAD>;
  close (PHPHEAD) || die 'kann phphead nicht schliessen';

eingelesen werden, mit

$h{head} = $phphead;

das eingelesene Array einer Variablen zugeordnet werden, die dann im Template mit

<!--cgi: head-->

ausgegeben wird.

Wie schaffe ich es also, eine ganze Datei einem Array oder einer Variablen zuzuordnen? Ist dies so überhaupt möglich oder
habe ich da irgendwo einen ganz großen Denkfehler?

Danke für Eure Tipps.

Christian

  1. Hallo!

    So liest Du den gesamten Inhalt der Datei in eine Variable:

    open (FILEHANDLE,"datei") or die "$!\n";
    read(FILEHANDLE, $datei, -s FILEHANDLE);
    close FILEHANDLE or die "Fehler beim Schliessen: $!\n";;

    eingelesen werden, mit
      $h{head} = $phphead;
    das eingelesene Array einer Variablen zugeordnet werden,

    Bitte was? Erstens taucht in dieser Zeile kein Array auf. Das was Du hier machst bedeutet(wenn auch syntaktisch falsch), daß du im Hash(!) %h dem Schlüssel $head(!) den Wert $phphead zuweist.

    Gruß Markus

    1. Erstmal Danke.

      Bitte was? Erstens taucht in dieser Zeile kein Array auf. Das was Du hier machst bedeutet(wenn auch syntaktisch falsch), daß du im Hash(!) %h dem Schlüssel $head(!) den Wert $phphead zuweist.

      Deine Kritik ist ja, auch in der Höhe, berechtigt, aber dieses Thema Hashes/Arrays ist für mich ein Buch mit sieben Siegeln

      Gruß Christian

  2. Hallo,

    [...] meine Frage, wie ich es schaffe eine ganze Datei einem Array oder einer Variablen zuzuordnen.

    Du willst
    perldoc perlfaq4 (How can I read in an entire file all at once?)
    lesen.

    open (PHPHEAD, 'E:/PHP4/php.exe F:/includes/head.php|') || die 'kann phphead nicht einbinden';
      @phphead = <PHPHEAD>;
      close (PHPHEAD) || die 'kann phphead nicht schliessen';

    Und schon passiert;-)
    @phphead ist ein Array, und es enthält das Ergebnis des php-Aufrufs.

    $h{head} = $phphead;

    In Deinem Context sollte es dann

    $h{head} = join('',@phphead);

    heißen. Näheres dazu durch
    perldoc -f join

    das eingelesene Array einer Variablen zugeordnet werden, die dann im Template mit

    <!--cgi: head-->

    ausgegeben wird.

    Hmmm. Jetzt kann ich Dir nicht mehr folgen.
    Heißt das, Du willst '<!--cgi: head-->' durch den Inhalt von (sagen wir mal) $h{head} ersetzen?

    Wenn ja, dann willst Du
    perldoc perlop
    und
    perldoc perlre
    lesen.

    Wie schaffe ich es also, eine ganze Datei einem Array oder einer Variablen zuzuordnen? Ist dies so überhaupt möglich oder
    habe ich da irgendwo einen ganz großen Denkfehler?

    Sicherlich ist es möglich, wer lesen kann ist klar im Vorteil.
    Und solltest Du wider Erwarten kein Perl installiert haben, so hilft http://www.perldoc.com/perl5.6/pod/perl.html weiter.

    Grüße
      Klaus

    PS.: mir ist klar, daß die Doku, die Perl beiliegt in Englisch ist. Solltest Du damit Probleme haben, so rate ich Dir die deutsche ausgabe von 'Programmieren in Perl' aus dem O'Reilley-Verlag zu kaufen.
    Ähm. Stimmt so nicht, ich rate es Dir in jedem Falle.

    1. ... rate ich Dir die deutsche ausgabe von 'Programmieren in Perl' aus dem O'Reilley-Verlag zu kaufen.
      Ähm. Stimmt so nicht, ich rate es Dir in jedem Falle.

      Das ist doch mal ein Tipp.

      Danke. Christian

    2. Hallo,

      perldoc perlfaq4 (How can I read in an entire file all at once?)

      Oje, falscher Film :-(

      perldoc perlfaq5 (How can I read in an entire file all at once?)

      sollte es heißen.

      Grüße
        Klaus

  3. Hi!

    open (PHPHEAD, 'E:/PHP4/php.exe F:/includes/head.php|') || die 'kann phphead nicht einbinden';
      @phphead = <PHPHEAD>;
      close (PHPHEAD) || die 'kann phphead nicht schliessen';

    Eine Datei liest man auf diese Weise in ein Array, das ist schon richtig. Das hier sieht aber mehr so aus, wie wenn Du die *Ausgabe* des aufgerufenen Programms in die Variable bekommen willst. Das ist zwar auf diese Weise moeglich (mit dem | am Ende), einfacher ist aber:
      @phphead = E:/PHP4/php.exe F:/includes/head.php;
    oder
      $phphead = E:/PHP4/php.exe F:/includes/head.php;
    Das nennt man Kommandosubstitution, und es liefert Dir die Ausgabe des aufgerufenen Programms in die jeweilige Variable, und zwar im Falle des Arrays zeilenweise und im Skalarkontext als einen grossen String.

    Falls Du das Backtick-Zeichen (` also das rueckwaertsgestellte Hochkomma) nicht auf Deiner Tastatur findest, kannst Du aequivalent auch z.B.
      @phphead = qx(E:/PHP4/php.exe F:/includes/head.php);
    verwenden, was voellig gleichbedeutend ist.

    Die Dokumentation dazu findest Du in
      perldoc perlop  (nach "qx/STRING/" suchen)
    oder auch bei http://www.perldoc.com/perl5.6/pod/perlop.html#qx%2FSTRING%2F.

    $h{head} = $phphead;

    Ist Dir klar, dass $phphead und @phphead zwei voellig verschiedene Variablen sind, die nicht das geringste miteinander zu tun haben? Obwohl das Zeichen am Anfang eine weitergehende Bedeutung hat (eben die Typunterscheidung), ist es ganz normaler Bestandteil des Namens.

    Wenn Du den Inhalt eines Arrays in einen einzige langen String zusammenfuegen willst, so macht man das gewoehnlich mit
      $x = join('', @y);

    So long