$xNeTworKx: Use of uninitialized value in concatenation (.) or string at...

Hi nochmal,

Schön langsam fängt der oben genannte Fehler mich an, etwas zu ärgern. Das Script funktioniert zwar wunderbar, aber ich habe im errorlog immer diese Meldung stehen. Ich schätze ich konnte den Fehler auf folgenden Code eingrenzen :

opendir(DIR,'messages') or die "Cant open postings : $! \nPlease send a mail to $mailadmin to report this error\n";
         while (defined($_ = readdir(DIR)))   {
                  if ($_ =~ /^\d+?.cgi$/)   {
                  my $headdata = '';
   open(FILE,"messages/$_") or die "Cant open $_ : $! \nPlease send a mail to $mailadmin to report this error\n";
                         for (my $i = 0; $i <= 5; $i++)    {   #die ersten 5 Zeilen einlesen
   my $line = <FILE>;
                         $headdata .= $line;
                         }
                  close FILE;
   my $unixzeit = $1 if $headdata =~ /<unixzeit>(\d+?)</unixzeit>/;
   my $thema = $1 if $headdata =~ /<topictitle>(.+?)</topictitle>/;
   my $firstmessby = $1 if $headdata =~ /<firstmessby>(.+?)</firstmessby>/;
   my $lastmessby = $1 if $headdata =~ /<lastmessby>(.+?)</lastmessby>/;
   my $lastdate = $1 if $headdata =~ /<lastdate>(.+?)</lastdate>/;
   print "<tr><td class="topiclinks"><a href="$baseurl?action=showreplies&posting=$_">$thema</a></td><td class="topic"> $firstmessby </td><td class="topic"> 1 </td><td class="topic"> 2 </td><td class="topic"><span class="replyname">$lastmessby</span><br> $lastdate </td></tr>\n";
                  }
 }
 closedir DIR;

Der Fehler muss irgendwie nach my $line = <FILE> auftreten.
Ich hatte vorher das "close FILE" nach der print Anweisung stehen, wobei ich die Meldung : Use of uninitialized value in concatenation (.) or string at c:\apache\forumneu\index.cgi line 152, <FILE> line 6.
bekam. Womit hängt das zusammen?, und vielleicht hilft es, wenn ich sage, dass die Meldung gleich 14 Mal hintereinander im Errorlog steht (Es werden 7 Files eingelesen).
Wo ist der Fehler ?

$xNeTworKx.

  1. Der Code sieht etwas zerschossen aus, habe den Teil hier nochmal gepostet:
    http://tools.acid4u.com/fehler.txt

  2. Hallo,

    dieses Problem habe ich just gerade auch gehabt. Bei mir trat es auf, wenn ich eine Zeile eingelesen und gesplittet habe. Dabei war in seltenen Fällen der erste String im Array leer, und bei der Verbindung von Variablen bei der Ausgabe kam es zu dem Fehler.

    Eine der von Dir verwendeten Variablen ist bei der Ausgabe leer. Das interessiert zwar nicht bei der Ausgabe, und es ist auch kein Fehler zu sehen, aber wenn Du zwei Werte über den . verbinden willst, ist es halt eben ein Fehler.

    Ich habe im Falle das die Variable leer ist, einen Ersatzwert zugewiesen.

    Jens

    1. Hi,

      Eine der von Dir verwendeten Variablen ist bei der Ausgabe leer.

      das hat mich jetzt auf die entscheidende Idee gebracht. Es sind 2 Variablen "im Anfangstadium" tatsächlich leer, und zwar :
         my $lastmessby = $1 if $headdata =~ /<lastmessby>(.+?)</lastmessby>/;
         my $lastdate = $1 if $headdata =~ /<lastdate>(.+?)</lastdate>/;

      Danke, ich bin sicher, dass es jetzt klappt ;)

      $xNeTworKx.

      1. use Mosche;

        Eine der von Dir verwendeten Variablen ist bei der Ausgabe leer.

        das hat mich jetzt auf die entscheidende Idee gebracht. Es sind 2 Variablen "im Anfangstadium" tatsächlich leer, und zwar :
           my $lastmessby = $1 if $headdata =~ /<lastmessby>(.+?)</lastmessby>/;
           my $lastdate = $1 if $headdata =~ /<lastdate>(.+?)</lastdate>/;

        Du solltest bei sowas immer ein if-else machen, das ganze geht ja schön kurz mit dem ?: Operator:
          my $lastdate = ($headdata =~ /<lastdate>(.+?)</lastdate>/)
                         ? $1 : '';

        Die Klammer kannst du weglassen, finde ich hier allerdings "schöner".

        use Tschoe qw(Matti);

        1. Hi,

          Du solltest bei sowas immer ein if-else machen, das ganze geht ja schön kurz mit dem ?: Operator:
            my $lastdate = ($headdata =~ /<lastdate>(.+?)</lastdate>/)
                           ? $1 : '';

          Ich habe es auf diese Weise versucht (mit : 0 statt : '', aber auch mit : '') , aber wo die Variablen leer sind, bekomme ich trotzdem die Fehlermeldung im Errorlog. Habe es so gelöst:

          my $lastmessby = 0;
          my $lastdate = 0;
          while ($headdata =~ /<lastmessby>(.+?)</lastmessby>/)   {
               if ($1 ne '')    {
               $lastmessby = $1;
               }
          }
          while ($headdata =~ /<lastdate>(.+?)</lastdate>/)   {
               if ($1 ne '')   {
               $lastdate = $1;
               }
          }
          if ($lastmessby == 0 || $lastdate == 0)  {
          print "<tr><td class="topiclinks"><a href="$baseurl?action=showreplies&posting=$_">$thema</a></td><td class="topic"> $firstmessby </td><td class="topic"> 1 </td><td class="topic"> 2 </td><td>  </td></tr>\n";
          }    else   {
          print "<tr><td class="topiclinks"><a href="$baseurl?action=showreplies&posting=$_">$thema</a></td><td class="topic"> $firstmessby </td><td class="topic"> 1 </td><td class="topic"> 2 </td><td class="topic"><span class="replyname">$lastmessby</span><br> $lastdate </td></tr>\n";
                }
          }

          So bekomme ich auf keinen Fall eine Fehlermeldung, aber geht das vielleicht noch kürzer ?

          $xNeTworKx.

  3. Hi

    Schön langsam fängt der oben genannte Fehler mich an, etwas zu ärgern. Das Script funktioniert zwar wunderbar, aber ich habe im errorlog immer diese Meldung stehen. Ich schätze ich konnte den Fehler auf folgenden Code eingrenzen :

    opendir(DIR,'messages') or die "Cant open postings : $! \nPlease send a mail to $mailadmin to report this error\n";
             while (defined($_ = readdir(DIR)))   {
                      if ($_ =~ /^\d+?.cgi$/)   {
                      my $headdata = '';
       open(FILE,"messages/$_") or die "Cant open $_ : $! \nPlease send a mail to $mailadmin to report this error\n";
                             for (my $i = 0; $i <= 5; $i++)    {   #die ersten 5 Zeilen einlesen

    $i soll von 0 bis 5 laufen (laut Schleife).
    Also die Werte 0, 1, 2, 3, 4, 5 einnehmen.
    Zähl doch mal die Werte.
    Ist die Schleife falsch oder der Kommentar?

    Abgesehen davon ist das so sehr riskant.
    Du prüfst nicht, ob die Zeile überhaupt gelesen werden konnte.
    Wenn die Datei also weniger Zeilen enthält als Du einliest, hast Du ein Problem...

    Andreas

    1. Hi,

      for (my $i = 0; $i <= 5; $i++)    {   #die ersten 5 Zeilen einlesen

      $i soll von 0 bis 5 laufen (laut Schleife).
      Also die Werte 0, 1, 2, 3, 4, 5 einnehmen.
      Zähl doch mal die Werte.

      ja du hast Recht, aber es wäre eigentlich egal, weil wenn ich 6 Zeilen einlese, würde das auch nichts zur Sache tun, weil eben die 6. Zeile nicht gebraucht wird. Sie wäre einfach nur überflüssig, aber sie existiert.

      Ist die Schleife falsch oder der Kommentar?

      Die Schleife.
      Ich habe $i < 5, $i <= 4, $i < 4 probiert, aber es kommt trotzdem die Fehlermeldung nach wie vor.

      Abgesehen davon ist das so sehr riskant.
      Du prüfst nicht, ob die Zeile überhaupt gelesen werden konnte.
      Wenn die Datei also weniger Zeilen enthält als Du einliest, hast Du ein Problem...

      danke für den Hinweis, aber es existieren auf jeden Fall die ersten 5 Zeilen. Der User hat auf diese Zeilen keinen Einfluss. Als die Datei erzeugt worden ist, wurden die 5 Zeilen in das Script geschrieben und können auch nur vom Script verändert werden, nicht vom User.

      $xNeTworKx.