Jörg Wittemeier: undef

Komme mit dem Befehl undef nicht klar.
Hab‚ein cgi-sript, was eine Image-Größe abfragt, und dazu den undef-Befehl benötigt:
------
open (JPG , "$picname") ;
undef $/;
$jpg=<JPG> ;
close(JPG);
($width,$height)=&jpegsize($jpg);
-------
danach kann ich keine Datei zeilenweise einlesen.
-------
@OPENDATA=("");
open(DATAFILE, "<$data2url");
while(defined($i =<DATAFILE>))
  {
push(@OPENDATA,$i);
print "$i<br>";
}
close(DATAFILE);
--------
$i wird nur einmal ausgeworfen (durch die print-Anweisung) und enthält die komplette Datei !!!??

Kennt sich jemand aus?

Gruß
Jörg

  1. Hallo Joerg!

    Eine laienhafte Erklaerung, da ich mich so gut auch nicht mit Perl auskenne:

    Dieser Befehl

    $jpg=<JPG> ;

    liesst eine Zeile aus JPG nach $jpg, gell? Aber woher weiss denn das Perl, wo die Zeile zu Ende ist? Naja, da wo das Newline-Zeichen ist, ist doch klar. Normal schon, ja, aber man kann das auch anders einstellen, naemlich in der vordefinierten Variable $/. Dort steht drin, wie das/die Zeilentrennzeichen auszusehen hat. Fuehrt man

    undef $/;

    durch, wird diese Variable vernichtet. Als Folge davon wird bei dem Befehl oben, der sonst nur eine Zeile einliesst, gleich die ganze Datei auf einmal reingezerrt.
    Siehe auch http://www.ActiveState.com/ActivePerl/docs/lib/Pod/perlvar.html#item_input_record_separator


    danach kann ich keine Datei zeilenweise einlesen.

    Weisst ja jetzt wieso. Setze einfach wieder
    $/ = "\n";   , dann sollte es wieder gehen. Auch auf MS-Systemen scheint kein "\r\n" noetig zu sein. Bei mir auf WinNT ist jedenfalls standardmaessig auch nur ein einfaches \n eingestellt. Diese Umsetzung (bei ausgeschaltetem binmode) erfolgt scheinbar nochmal gesondert.

    Calocybe

    1. Hi,

      Eine laienhafte Erklaerung, da ich mich so gut auch nicht mit Perl auskenne:

      soweit ich mich auskenne, ist sie richtig :-)

      $/ = "\n";   , dann sollte es wieder gehen. Auch auf MS-Systemen scheint kein "\r\n" noetig zu sein. Bei mir auf WinNT ist jedenfalls standardmaessig auch nur ein einfaches \n eingestellt. Diese Umsetzung (bei ausgeschaltetem binmode) erfolgt scheinbar nochmal gesondert.

      Nein, das ist schlicht und einfach automatisch mit inbegriffen. Wenn eine Zeile z.B. "Zeile\r\n" lautet, ist am Ende immer noch ein "\n", und Perl beendet das Einlesen. Und da $/ mit eingelesen wird (anstatt ignoriert zu werden), ändert sich auch nichts. Ganz einfach :-)

      Cheatah

      1. Hi Moin!

        Eine laienhafte Erklaerung, da ich mich so gut auch nicht mit Perl auskenne:
        soweit ich mich auskenne, ist sie richtig :-)

        Richtig mag sein, aber ich will sowas lieber bis zum aeussersten begruendet wissen. Wenn ich was zu JavaScript schreibe, zitiere ich ja auch immer saemtliche Netscape-Dokus (ja, alle beide *g*), aber bei Perl weiss ich da halt nicht so Bescheid.

        Nein, das ist schlicht und einfach automatisch mit inbegriffen. Wenn eine Zeile z.B. "Zeile\r\n" lautet, ist am Ende immer noch ein "\n", und Perl beendet das Einlesen. Und da $/ mit eingelesen wird (anstatt ignoriert zu werden), ändert sich auch nichts. Ganz einfach :-)

        Oops ja, ist einzusehen. Beim Mac muesste dann aber trotzdem \r in $/ stehen, kein \n. Oder?

        Calocybe

        P.S. Sag mal, kommt es Dir auch so vor, wie wenn es hier heute verdammt ruhig ist? Wahrscheinlich muss der Durchschnitt der number of postings per day wieder mal nach unten korrigiert werden.

        1. Hi,

          Eine laienhafte Erklaerung, da ich mich so gut auch nicht mit Perl auskenne:
          soweit ich mich auskenne, ist sie richtig :-)

          Richtig mag sein, aber ich will sowas lieber bis zum aeussersten begruendet wissen. Wenn ich was zu JavaScript schreibe, zitiere ich ja auch immer saemtliche Netscape-Dokus (ja, alle beide *g*), aber bei Perl weiss ich da halt nicht so Bescheid.

          naja, das meine ich doch: Ich hätte es nicht besser erklären können ;-)

          Nein, das ist schlicht und einfach automatisch mit inbegriffen. Wenn eine Zeile z.B. "Zeile\r\n" lautet, ist am Ende immer noch ein "\n", und Perl beendet das Einlesen. Und da $/ mit eingelesen wird (anstatt ignoriert zu werden), ändert sich auch nichts. Ganz einfach :-)

          Oops ja, ist einzusehen. Beim Mac muesste dann aber trotzdem \r in $/ stehen, kein \n. Oder?

          Wird wohl, das weiß ich aber nicht. Kann einer der Mac-User das mal ausprobieren? :-)

          P.S. Sag mal, kommt es Dir auch so vor, wie wenn es hier heute verdammt ruhig ist? Wahrscheinlich muss der Durchschnitt der number of postings per day wieder mal nach unten korrigiert werden.

          Vermutlich hat Stefan eine entsprechende Sperre eingebaut ;-)))

          Cheatah