xNeTworKx: Strings mit Variablen verbinden ?

Hallo nochmal,
Ich will wie schon gesagt Strings mit Variablen verbinden um einen Namen für eine Datei zu erzeugen. Nur komm ich leider nicht drauf was hier falsch is.

push @hilfsliste, 'text';
push @hilfsliste, $counter;
push @hilfsliste, '.txt';
$dateiname = join('',@hilfsliste);
open (FILE,">$dateiname") or die "Neue Datei kann nicht geoeffnet werden : $!\n";
close FILE;

  1. Hi,

    push @hilfsliste, $counter;

    hier wird der _Inhalt_ der Variable $counter gepusht. Wenn Du eine Referenz auf dieselbe brauchst, solltest Du Dich intensiv mit

    perldoc perlref
    perldoc perlreftut

    beschäftigen.

    close FILE;

    Bei Schreibzugriffen solltest Du hier ebenfalls den Fehlercode abfangen.

    Cheatah

    1. Hallo

      push @hilfsliste, $counter;

      hier wird der _Inhalt_ der Variable $counter gepusht.

      Das will ich eh machen, 'text' + den Wert vom Counter + '.txt' ,aber irgendwo stimmt etwas nicht ?

      1. Das will ich eh machen, 'text' + den Wert vom Counter + '.txt' ,aber irgendwo stimmt etwas nicht ?

        Wieso nicht so:
        $dateiname = "text$counter.txt"

        oder:
        $dateiname = 'text' . $counter. '.txt'

  2. Sup!

    Was kommt denn für ein Fehler / was steht in $dateiname / was funktioniert nicht? So auf den ersten Blick sieht das ganz okay aus...
    Und ohne Fehlerbeschreibung sucht man auch ungern nach Fehlern.

    <img src="http://outpost.purespace.de/kristall.gif" border=0 alt="">

    Gruesse,

    Bio

    1. Sup!

      Was kommt denn für ein Fehler / was steht in $dateiname / was funktioniert nicht? So auf den ersten Blick sieht das ganz okay aus...

      Wenn ichs vom Server laufen lasse -> Internal Server Error
      Wenn ichs von der DOS Befehlszeile mit perl -d ausführe erkennt er keinen Fehler. Ich poste mal das Script so weit wie es bis jetzt ist.

      #!/usr/bin/perl -w

      use CGI;
      use CGI::Carp qw(fatalsToBrowser);
      $query = new CGI;
      $counter = 0;
      @hilfsliste = "";
      $dateiname = "";

      print $query->header;
      open(ZAEHLER,">>data.txt") or die "Zaehler kann nicht geoeffnet werden : $!\n";
      flock ZAEHLER, 2;
      print ZAEHLER "a";
      close ZAEHLER;

      open(ZAEHLER,"<data.txt") or die "Zaehler kann nicht geoeffnet werden : $!\n";
      while (<ZAEHLER>)
         {
          while (/a/)
             {
             $counter++;
             }
         }
      close ZAEHLER;
      push @hilfsliste, 'text';
      push @hilfsliste, $counter;
      push @hilfsliste, '.txt';
      $dateiname = join('',@hilfsliste);
      open (FILE,">$dateiname") or die "Neue Datei kann nicht geoeffnet werden : $!\n";
      close FILE;

      1. Hallo,

        Wenn ichs vom Server laufen lasse -> Internal Server Error

        Was steht im Error-Log des Webservers?

        #!/usr/bin/perl -w

        use CGI;
        use CGI::Carp qw(fatalsToBrowser);

        Hier würde ich auch unbedingt ein
        use strict;
        einfügen. Allerdings solltest Du Dir dann auch die Geschichte mit 'my' ansehen;-)

        $query = new CGI;
        $counter = 0;
        @hilfsliste = "";
        $dateiname = "";

        print $query->header;
        open(ZAEHLER,">>data.txt") or die "Zaehler kann nicht geoeffnet werden : $!\n";
        flock ZAEHLER, 2;
        print ZAEHLER "a";
        close ZAEHLER;

        open(ZAEHLER,"<data.txt") or die "Zaehler kann nicht geoeffnet werden : $!\n";
        while (<ZAEHLER>)
           {
            while (/a/)
               {
               $counter++;
               }
           }
        close ZAEHLER;

        Diese Art, einen Zähler zu implementieren wird auf Dauer recht unperformat, da die Datei ziemlich groß werden kann. Warum schreibst Du den Zähler nicht einfach in die entsprechende Datei:
        (Hier jetzt mal eine absolut quick & dirty version)
        my $counter;
        if(open(IN,'data.txt'))
           {
           $counter= <IN>;
           close  IN;
           }
        else
           {
           $counter = 0;
           }
        $counter++;

        if(open(OUT,'>data.txt'))
          {
          print OUT $counter;
          close OUT;
          }

        Wie gesagt, hier fehlen noch einige dinger wie flocks und so.

        push @hilfsliste, 'text';
        push @hilfsliste, $counter;
        push @hilfsliste, '.txt';
        $dateiname = join('',@hilfsliste);
        open (FILE,">$dateiname") or die "Neue Datei kann nicht geoeffnet werden : $!\n";
        close FILE;

        Das ist zwar recht unüblich sollte aber trotzdem funktionieren, vielleicht klemmts ja schon weiter oben.

        Aber warum versuchst Du es nicht mal etwas mehr perlish:
           $dateiname = "text$counter.txt";
        bzw. (deutlich krisensicherer)
           $dateiname = "text${counter}.txt";
        anstelle des Arrays und einem join.

        Grüße
          Klaus

        1. Hallo,

          Was steht im Error-Log des Webservers?

          Wenn ich wüsste wo ich das nachsehe, würd ichs dir gern sagen (hab mich immer schon gefragt wo das steht)

          #!/usr/bin/perl -w

          use CGI;
          use CGI::Carp qw(fatalsToBrowser);

          Hier würde ich auch unbedingt ein
          use strict;
          einfügen. Allerdings solltest Du Dir dann auch die Geschichte mit 'my' ansehen;-)

          Deswegen geb ichs nicht dazu, da dann noch ein Fehler auftreten könnte durch ein vergessenes my und die ganze Sache würde noch sehr viel komplizierter werden. Bis leider kein Profi Perler =)

          btw. Ich bin leider noch immer nicht draufgekommen, wo der Fehler ist .

          1. Hi,

            Wenn ich wüsste wo ich das nachsehe, würd ichs dir gern sagen (hab mich immer schon gefragt wo das steht)

            das wird Dir entweder Dein aktueller Provider verraten, oder der, zu dem Du wechselst, wenn es Dir der aktuelle nicht verrät. CGI-Programmierung ohne Error-Log ist wie ein Auto, in dessen Karosserie keine Aussparungen für Scheiben vorgesehen wurden.

            use strict;
            einfügen. Allerdings solltest Du Dir dann auch die Geschichte mit 'my' ansehen;-)

            Deswegen geb ichs nicht dazu, da dann noch ein Fehler auftreten könnte durch ein vergessenes my und die ganze Sache würde noch sehr viel komplizierter werden.

            *seufz* Durch strict _vermeidest_ Du Fehler, weil Du auf potentielle solche hingewiesen wirst! Wenn Dein Script in der derzeitigen Fassung nicht mit strict lauffähig ist, ist es buggy.

            Bis leider kein Profi Perler =)

            Ich auch nicht. Wahrscheinlich gibt es nicht viele hier, die Perl beruflich einsetzen - das ist aber ohnehin noch lange kein Zeichen dafür, dass man etwas gut kann.

            btw. Ich bin leider noch immer nicht draufgekommen, wo der Fehler ist .

            Da kannst Du Dich auch zu Tode raten, solange Du nicht ins Error-Log schaust :-)

            Cheatah

          2. Hallo,

            Was steht im Error-Log des Webservers?

            Wenn ich wüsste wo ich das nachsehe, würd ichs dir gern sagen (hab mich immer schon gefragt wo das steht)

            Das hängt von der Konfiguration des Servers ab, meist ist er auch dort zu finden, wo auch der normale Access-Log zu finden ist. Im Zweifelsfalle solltest Du Deinen ISP fragen.

            #!/usr/bin/perl -w

            use CGI;
            use CGI::Carp qw(fatalsToBrowser);

            Hier würde ich auch unbedingt ein
            use strict;
            einfügen. Allerdings solltest Du Dir dann auch die Geschichte mit 'my' ansehen;-)

            Deswegen geb ichs nicht dazu, da dann noch ein Fehler auftreten könnte durch ein vergessenes my und die ganze Sache würde noch sehr viel komplizierter werden. Bis leider kein Profi Perler =)

            So schwierig ist das nicht.
            use strict;
            am Anfang des Scripts, und jede Variable mit my einführen
            Beispiel:

            #!/usr/bin/perl -w

            use strict;
            use CGI;

            my $query = new CGI;

            my $counter;
            my %IrgendeinHash;

            $x = 1; # uups, das geht nicht, weil $x nicht mit my eingeführt wurde

            Siehe auch http://selfhtml.teamone.de/cgiperl/sprache/intro.htm#programmierstil

            btw. Ich bin leider noch immer nicht draufgekommen, wo der Fehler ist .

            Hmm, vielleicht doch etwas ganz Triviales. Wo ist denn der Perl-Interpreter am Server installiert. Wenn der nämlich nicht unter /usr/bin/perl zu finden ist, dann funktionierts auch nicht.
            Vielleicht solltest Du mal einige Teile des Codes wieder ausblenden (einfach Kommentarzeichen # am Anfang der entsprechenden Zeilen)
            und versuche so ein funktionierendes Script zu finden.

            Hier ein absolutes Minial-Script:
            #/usr/bin/perl

            print "Content-Type: text/plain\n\nhall Du\n";

            wenn das nicht get, dann stimmt wirklich was grundsätzliches nicht.

            Grüße
              Klaus

            1. Hi,

              #/usr/bin/perl

              print "Content-Type: text/plain\n\nhall Du\n";

              wenn das nicht get, dann stimmt wirklich was grundsätzliches nicht.

              ja, nämlich das fehlende "!" in der Shebang ;-)

              Cheatah

            2. Hallo nochmal,
              Also das mit dem Perl Interpreter usw stimmt alles .Hmmm ,werds einfach weiterversuchen, trotzdem danke für eure Hilfe inzwischen.

              1. Hallo nochmal
                es funktioniert jetzt, ich hab nach dem (/a/ das g vergessen, also (/a/g), noch dazu hab ich die Datei data.txt ganz gelöscht und wieder neu erzeugen lassen. Kann mir aber trotzdem nicht erklären warum da ein Fehler aufgetreten is, weil wenn ich das ->g vergesse, zählt er eben nur einmal und die Datei bekommt eben den Namen text1.txt ,aber was solls, jetzt funktionierts.

      2. Hi,

        Wenn ichs vom Server laufen lasse -> Internal Server Error

        diese Meldung hat Deine Instinkte vollständig zu überladen. Du setzt die Atmung aus, lässt Dein Herz ruhen, denkst nicht mal an Sex. Dein Universum reduziert sich auf das Error-Log Deines Servers. Erst wenn Du dieses konsultiert hast, darfst Du Dein Herz wieder schlagen lassen.

        #!/usr/bin/perl -w

        use strict; # s. auch Klaus' Posting

        use CGI::Carp qw(fatalsToBrowser);

        Wenn der Server nicht mal bis hierher kommt, ist er fehlkonfiguriert, hat nicht genügend Rechte zur Scriptausführung, oder der Perl-Interpreter findet nur Unsinn (ASCII-Modus bei FTP nicht vergessen).

        @hilfsliste = "";

        Dir ist klar, dass Du hier ein Array deklarierst, welches bereits ein (leeres) Element enthält?

        $dateiname = "";

        Nebenbei möchtest Du Doublequotes vermeiden, wenn Du sie nicht unbedingt brauchst. Hier reichen Singlequotes vollkommen aus.

        open(ZAEHLER,"<data.txt")

        Auch hier. Übrigens kann diese Datei sonstwo im Filesystem gesucht werden - bei CGI ist der Begriff "aktuelles Verzeichnis" undefiniert und entspricht höchstens zufällig dem, was Du erwartest!

        while (<ZAEHLER>)
           {
            while (/a/)
               {
               $counter++;
               }
           }

        Von Klaus' völlig richtiger Anmerkung abgesehen: Wenn Du mal in die Verlegenheit kommst, _wirklich_ die Zeilenanzahl einer Datei auslesen zu müssen, solltest Du je nach Dateigröße auf performantere Wege umsteigen. Unter Unix wäre z.B.

        my $counter = wc -l data.txt;

        ein brauchbarer Anfang; wobei Du niemals vergessen solltest, dass dieses Script dann nur noch unter bestimmten Bedingungen lauffähig ist.

        close FILE;

        Wie erwähnt: Auch hier solltest Du den Fehlerfall abfangen.

        Cheatah