Roland: Daten schreiben + auslesen

Guten Tag!

Ich möchte eine ganz simple Funktion, die eine Zahl jeweils um 1 höher zählt und dann wieder in eine Datei schreibt. Es soll bei 0 losgehen.

Ich wäre sehr dankbar, wenn mir jemand helfen würde.

Roland

  1. open FILE, "counter.txt";
    $counter = <FILE>;
    close FILE;

    open FILE, ">counter.txt";
    print FILE ++$counter;
    close FILE;

    1. use Mosche;

      Dieses Beispiel ist _falsch_, denn

      open FILE, "counter.txt";
      $counter = <FILE>;
      close FILE;

      $counter ist zu Begin "\n", uns sonst "1\n", ...

      open FILE, ">counter.txt";
      print FILE ++$counter;
      close FILE;

      Außerdem fragst du keine Fehler ab, was insbesondere bei Dateioperation sinnvoll bis notwendig ist.

      use Tschoe qw(Matti);

      1. Hi,

        Dieses Beispiel ist _falsch_, denn

        ja, und zudem unschön, wie in

        perldoc perlstyle

        nachzulesen ist. Es wird auch den w-Switch und strict nicht in dieser Form überleben.

        $counter ist zu Begin "\n",

        Nein, "", was trotzdem nicht 0 ist. Ob es aber "\n" oder vielleicht "\r" wäre, hängt vom Betriebssystem ab.

        Außerdem fragst du keine Fehler

        ...und parallelen Operationen...

        ab, was insbesondere bei Dateioperation sinnvoll bis notwendig ist.

        Sagen wir: notwendig bis unumgänglich.

        Wieder ein hervorragendes Beispiel, warum man keinen Code posten sollte, der nicht mindestens aus der offiziellen Doku stammt... :-)

        Cheatah

        1. Danke für eure Antworten, aber was ist denn an dem Code von Markus falsch?
          Klappt wunderbar und ist sehr kurz.

          Tschüss,
          Roland

          1. Hi,

            Danke für eure Antworten, aber was ist denn an dem Code von Markus falsch?

            er ist undurchdacht.

            Klappt wunderbar

            Unter Laborbedingungen. Er ist nicht praxistauglich - dort wird er zu unbestimmbaren Zeitpunkten versagen und irreversible Datenverluste erleiden.

            und ist sehr kurz.

            Aber nicht optimiert, in keiner Hinsicht.

            Cheatah

            1. Hi Cheatah,
              ist ja ein einfaches Beispiel ...

              Wie wäre der Counter in Deinen Augen "optimiert"?

              Einfach die flocks beachten und ein paar || positionieren
              oder fehlt noch mehr ...

              Ich habe weiter oben gesehen,
              dass Du den print-Vorgang (print "$data")
              icht auf Fehler absichern würdest.

              Ist das nicht notwendig?
              Bin halt kein Gelernter und knall
              bei Dateioperationen ein ODER hin, wo's nur geht.

              Besteht da keine Gefahr, dass Nichts geschrieben
              und hinterher sauber geschlossen wird?

              Kann man den Fall noch abfangen, dass:
              Datei lesen -> flock2 -> Datei zu -> Berechnungsvorgang ->
              ... gerade in diesem Moment liest jemand anders die datei ein
              und printet hinterher meine Daten wieder weg ...

              Wenn ich flock8 aber während des Berechnungsvorgangs aufrechterhalte,
              wird der Andere nicht gezählt, weil er die datei nicht laden konnte.

              Ist ein sehr einfaches Beispiel mit dem counter,
              aber ich hoffe, meine Frage wird deutlich.

              Wie kann man sowas am besten händeln?
              Viele Grüsse, ikke

          2. Hi Roland,

            Danke für eure Antworten, aber was ist denn an dem
            Code von Markus falsch?

            er löst das Problem nicht,.

            Klappt wunderbar

            Vielleicht in einigen wenigen Testfällen.
            Nicht aber allgemein - beispielsweise wenn zwei Leute gleichzeitig den Counter zu erhöhen versuchen.

            und ist sehr kurz.

            Eben. Zu kurz.

            Viele Grüße
                  Michael

  2. Hi,

    Ich wäre sehr dankbar, wenn mir jemand helfen würde.

    gerne doch. Vielleicht erzählst Du zuerst einmal, was Du bisher versucht hast und woran Dein Vorhaben gescheitert ist.

    Cheatah

    1. Guten Abend

      Ich wäre sehr dankbar, wenn mir jemand helfen würde.

      gerne doch. Vielleicht erzählst Du zuerst einmal, was Du bisher versucht hast und woran Dein Vorhaben gescheitert ist.

      $zahl = 0;
      open (DATA, ">$datei");
      @zeilen = <DATA>;
      ($zahl) = split(//,@zeilen);
      $zahl++;
      print DATA ("$zahl");
      close (DATA);

      $zahl = 0;
      open (DATA, ">$datei");
      $zahl = <DATA>;
      $zahl++;
      print DATA ("$zahl");
      close (DATA);

      Hilft alles nichts.

      Darf ich mich jetzt deiner Hilfe erfreuen?

      Roland

      1. Hi Roland

        print DATA ("$zahl");

        Versuch doch mal:
        print DATA "$zahl"; oder
        print DATA $zahl;
        (Bin auch kein gelernter ;o)

        Wozu nutzt Du die Klammern?

        Grüsse ikke

      2. Hi,

        #!/usr/bin/perl -w
        use strict;

        perldoc perlrun
        perldoc strict

        $zahl = 0;

        my $zahl = 0;

        perldoc -f my

        open (DATA, ">$datei");

        Willst Du hier schon schreiben? Ich glaube, erst mal suchst Du den Inhalt, oder?

        open(DATA, $datei) or die "Kann $datei nicht oeffnen: $!";

        perldoc perlstyle
        perldoc perlfaq4 (What's wrong with always quoting "$vars"?)
        perldoc -f die
        perldoc perlopentut
        perldoc perlvar ($!)

        @zeilen = <DATA>;

        Wie viele Zeilen?

        ($zahl) = split(//,@zeilen);

        Huh? Das musst Du mir erklären.

        $zahl++;

        Ah, das sieht richtig aus :-)

        print DATA ("$zahl");

        Listenkontext ist nicht notwendig. Lass die Klammern weg (s. ikke).

        close (DATA);

        Auch hier den Fehlerfall abfangen.

        $zahl = <DATA>;

        Wenn nichts in DATA drinsteht, dann hat $zahl den Wert...?

        Hilft alles nichts.
        Darf ich mich jetzt deiner Hilfe erfreuen?

        Verantwortlicher Fehler: Du öffnest die Datei zum Schreiben und versuchst dann, daraus zu lesen. Mache Dir bewusst, wie das Betriebs- und Dateisystem einen Dateizugriff handhabt.

        Cheatah

      3. Moin!

        perldoc perlopentut

        ==> perlopentut - tutorial on opening things in Perl

        Auf die Gefahr hin, daß das getzt gegrummelt ist, aber ich würde mir an Deiner Stelle erst mal ein gutes Perl Buch oder gewisse Teile der Doku (perlfunc, perlop, perldata, perlvar) durchlesen. - Spart im Endeffekt Zeit.

        Grüße
           K@rl

  3. Hallo Roland,

    na, zu Faul die Hausaufgabe zu machen? ;-)

    Grüße
       K@rl

    1. Hallo K@rl.

      na, zu Faul die Hausaufgabe zu machen? ;-)

      Aus dem Alter bin ich schon lange heraus...