Pit: Immer noch: Daten per if Anweisung in xx.dat oder yy.dat schreiben

Hallo an alle,

ich habe eine Frage, vielleicht weiß von Euch einer die Antwort für mich, dazu erst mal ein Teil meines Quelltextes:

open(DB, "<$db_file_name") die "Can't open: $db_file_name. Reason: $!";
             if ($db_use_flock) {
   flock (DB, 1);
   }
             @lines = <DB>;
        close DB;

open (DB, ">$db_file_name") or ("Can't open: $db_file_name. Reason: $!");
              if ($db_use_flock) {
   flock (DB, 2);
    }
             foreach (@lines) {
                  next if /^#/;
                  next if /^\s*$/;
                  chomp;
                  @values = &split_decode ($_);
              
        if (BLA,BLA,BLA) {
                  print "...wird in Datei-y geschrieben\n";

next;
            }
print DB $_, "\n";
        }
      close DB;

Nun meine Frage:

Die if-Anweisung ist im übrigen kein  Problem

Alle "Einträge", die nicht unter die if-Bedingung fallen, fallen bis dato einfach nur heraus, sprich die datei-x wird ohne sie neu geschrieben.

Wie bekomme ich aber das Schreiben der unter die if-Bedingung fallenden "Einträge" in eine auf dem Server vorhandene y-datei hin??

Danke für Hilfe.

Pit

  1. Hallo Pit.

    open (DB, ">$db_file_name") or ("Can't open: $db_file_name. Reason: $!");

    Hm, das klappt ja schon ganz gut mit dem Öffnen einer Datei.
    Meinst du, das bekommst du auch noch ein zweites mal hin? Also zwei Dateien parallel öffnen ...? Sollte dein Computer doch schaffen, bis zwei zu zählen.

    Alle "Einträge", die nicht unter die if-Bedingung fallen, fallen bis dato einfach nur heraus, sprich die datei-x wird ohne sie neu geschrieben.

    Wie bekomme ich aber das Schreiben der unter die if-Bedingung fallenden "Einträge" in eine auf dem Server vorhandene y-datei hin??

    Also ich nehme immer zwei Notizzettel, schreibe alles da drauf und scanne die einzeln ein.
    Nein, im Ernst. Du kannst auch mehr als eine Datei gleichzeitig offen halten. Probiere es aus.

    Viele Gruesse
      Kess

    1. Nein, im Ernst. Du kannst auch mehr als eine Datei gleichzeitig offen halten. Probiere es aus.

      Viele Gruesse
        Kess

      Hi Kess, hi Cheatah,

      genau das hab ich ja versucht und da es nicht gefuntzt hat, hab ich gedacht, man dürfe keine 2 Dateien parallel geöffnet haben und das ganze müsse dann über eine Liaste laufen, usw. usw.

      Das ganze sah dann so aus:

      open (DB, ">$db\_file\_name") or ("Can't open: $db\_file\_name. Reason: $!");  
      

      if ($db_use_flock) {
         flock (DB, 2);
          }
                   foreach (@lines) {
                        next if /^#/;
                        next if /^\s*$/;
                        chomp;
                        @values = &split_decode ($_);

      print "Comparing: '$today' vs '$values[$removeby_field]' ... <br>\n";
              if ($today > (&date_to_unix($values[$dateadded_field]) + (86400 * $values[$removeby_field]))) {
                        print "Eintrag archiviert<br>\n";

      open (ARC, ">>$db_archive_name") or &cgierr("error in archive_record. unable to open database: $db_archive_name.\nReason: $!");
              if ($db_use_flock) {
                flock(ARC, 2)  or &cgierr("unable to get exclusive lock on $db_archive_name.\nReason: $!");
              }
              print ARC "$line\n";  
            close ARC;    # automatically removes file lock

      next;
                  }
      print DB $_, "\n";
              }
            close DB;

      Wie Ihr sicher sehen könnt, geht es darum, Eiträge, die älter sind als eine vorgegebene Anzahl von Tagen, zu archivieren.

      Pit

      P.S.: Danke schonmal bis hierhin

      1. Hi,

        open (ARC, ">>$db_archive_name") or &cgierr("error in archive_record. unable to open database: $db_archive_name.\nReason: $!");

        sieht eigentlich gut für mich aus, abgesehen davon, daß ein Fehler ein Grund für 'or die "Fehler: $!"' wäre. Was sagt er Dir denn für einen Reason?

        Cheatah

        1. Hi,

          open (ARC, ">>$db_archive_name") or &cgierr("error in archive_record. unable to open database: $db_archive_name.\nReason: $!");

          sieht eigentlich gut für mich aus, abgesehen davon, daß ein Fehler ein Grund für 'or die "Fehler: $!"' wäre. Was sagt er Dir denn für einen Reason?

          Cheatah

          Hi Cheatah,

          erst mal danke für die Antwort!

          Ob sub cgierr oder die ist nicht relevant, weil das script gar nicht drauf reagiert.
          Ich bekomm im übrigen auch gar keine Fehlermeldung.

          Das Ende vom Lied ist, daß die Zeilen (Einträge), die ihr Verfallsdatum erreicht haben, einfach gelöscht anstatt archiviert werden.

          Pit

          1. ..ein Zusatz noch (weil ich noch nicht so fit in perl bin):

            Kannst Du mir nen Link geben, wo ich mal wirklich etwas mehr über ($_) erfahre, nicht nur so'n paar einleitende Worte?

            Pit

            1. Hi,

              Kannst Du mir nen Link geben, wo ich mal wirklich etwas mehr über ($_) erfahre, nicht nur so'n paar einleitende Worte?

              keinen Link, aber in

              perldoc perlvar

              steht ein wenig was. Hast Du denn irgendwelche speziellen Fragen? Sooo viel steckt nämlich gar nicht dahinter, daß man da Seiten drüber schreiben könnte. Es ist halt einfach die Default-Variable, die genutzt wird, wenn keine Variable angegeben wird.

              Cheatah

              1. Hi,

                Kannst Du mir nen Link geben, wo ich mal wirklich etwas mehr über ($_) erfahre, nicht nur so'n paar einleitende Worte?

                keinen Link, aber in

                perldoc perlvar

                steht ein wenig was. Hast Du denn irgendwelche speziellen Fragen? Sooo viel steckt nämlich gar nicht dahinter, daß man da Seiten drüber schreiben könnte. Es ist halt einfach die Default-Variable, die genutzt wird, wenn keine Variable angegeben wird.

                Cheatah

                Hi Cheatah,

                das ging ja schnell. Irgendwie bring ich den Zusammenhang nicht so recht hin.
                Blöd ist auch, daß ich inzwischen gar nicht mehr recht weiß, was ich hier fragen darf und was nicht, aber das nur am Rande.

                Tja, das script löscht jedenfalls nur die "überfälligen" Eiträge herraus, ist ja auch schjonmal was.

                Gibt es denn irgendeine andere Lösung, als die, die ich angedacht hatte?
                Wie würdest Du das machen?

                Pit

                1. hi cheatah,

                  ich habs jetzt:

                  open (DB, "<$db_file_name") or &cgierr("error in archive_records. unable to open db file: $db_file_name.\nReason: $!");
                      if ($db_use_flock) { flock(DB, 1); }
                      @lines = <DB>;
                    close DB;

                  LINE: foreach $line (@lines) {
                      if ($line =~ /^$/) { next LINE; }
                      if ($line =~ /^#/) { $output .= $line; next LINE; }
                      chomp ($line);      
                      @data     = &split_decode($line);
                                    print "Ich vergleiche: '$today' vs '$data[$removeby_field]' ... <br>\n";
                          if ($today > (&date_to_unix($data[$dateadded_field]) + (86400 * $data[$removeby_field]))) {
                                    print "Eintrag $data[0] archiviert<br>\n";

                  open (ARC, ">>$db_archive_name") or &cgierr("error in archive_record. unable to open database: $db_archive_name.\nReason: $!");
                          if ($db_use_flock) {
                            flock(ARC, 2)  or &cgierr("unable to get exclusive lock on $db_archive_name.\nReason: $!");
                          }
                          print ARC "$line\n";  
                        close ARC;    # automatically removes file lock
                      }
                      else {
                        $output .= $line . "\n";
                      }
                    }
                    
                    open (DB, ">$db_file_name") or &cgierr("error in archive_records. unable to open db file: $db_file_name.\nReason: $!");
                      if ($db_use_flock) {
                        flock(DB, 2) or &cgierr("unable to get exclusive lock on $db_file_name.\nReason: $!");
                      }
                      print DB $output;
                    close DB;    # automatically removes file lock

                  Cheatah, warum klappt das denn jetzt??

                  Pit

                  1. Hi,

                    Cheatah, warum klappt das denn jetzt??

                    was hast Du geändert?

                    Cheatah

                    1. Hi,

                      Cheatah, warum klappt das denn jetzt??

                      was hast Du geändert?

                      Cheatah

                      Hi Cheatah,

                      ich hab Dir doch die neue Version im vorigen Posting geschickt.
                      Die erste Version steht im ersten Posting dieses Threads.

                      Pit

                      1. Hi,

                        was hast Du geändert?

                        ich hab Dir doch die neue Version im vorigen Posting geschickt.
                        Die erste Version steht im ersten Posting dieses Threads.

                        ich finde kaum Ähnlichkeit, u.a. weil Du im Ursprungsposting stark symbolisiert hast. Bedenke auch, daß ich nicht so sehr im Code stecke wie Du.

                        Sag mir, was Du geändert hast, und ich versuche zu antworten. Laß es bleiben, und ich laß es bleiben. Ganz einfach.

                        Cheatah

                        1. Hi,

                          was hast Du geändert?

                          ich hab Dir doch die neue Version im vorigen Posting geschickt.
                          Die erste Version steht im ersten Posting dieses Threads.

                          ich finde kaum Ähnlichkeit, u.a. weil Du im Ursprungsposting stark symbolisiert hast. Bedenke auch, daß ich nicht so sehr im Code stecke wie Du.

                          Sag mir, was Du geändert hast, und ich versuche zu antworten. Laß es bleiben, und ich laß es bleiben. Ganz einfach.

                          Cheatah

                          Hi Cheatah,

                          ich kann ja verstehen, daß es für Dich schwierig ist, sich in den Code reinzudenken, aber diese beiden Codes sind von ihrem Inhalt sehr ähnlich.

                          Der Unterschied besteht wohl darin, in 2 variabeln die datensätze abzulegen ($line,$output).

                          Aber genauer kann ich Dir das nicht sagen, weil ich nur durch logisches Denken und umsetzen von scriptparts anderer scripte dahin gekommen bin.
                          Ich habe also versucht, zu verstehen, wie ein anderes script etwas macht, und das auf meine aufgabe umgemünzt.

                          Rein von der logig aber hätte ich gesagt, das auch der erste versuch hätte klappen müssen.

                          Hat aber nicht, der 2. Anlauf aber schon, und ich weiß nicht genau, warum.

                          Wenn ich wüßte, warum der erste nicht funktioniert, wäre mir schon gedient. (weil ich bin nicht einer, der hier postet, um eine Lösung zu haben, sondern um zu verstehen.)

                          Danke Dir im Voraus
                          Pit

          2. Hi,

            Ob sub cgierr oder die ist nicht relevant, weil das script gar nicht drauf reagiert.
            Ich bekomm im übrigen auch gar keine Fehlermeldung.

            aber die Zeile
            print "Eintrag archiviert<br>\n";
            wird ausgeführt?

            Cheatah

  2. Hi,

    ich habe eine Frage, [...]

    gefiel Dir meine Antwort in http://www.teamone.de/selfaktuell/forum/messages/75386.html so wenig, daß Du die _selbe_ Frage noch einmal stellen mußt? Bitte frag doch im alten Thread nach, anstatt ihn noch mal neu zu öffnen.

    Ich schätze mal, das meinte Stefan auch einen Thread tiefer, wo Du 100%ig mit ihm einer Meinung bist.

    Cheatah