Gary: sub + filelock nicht möglich!

0 53

sub + filelock nicht möglich!

Gary
  • perl
  1. 1
    CPAN
    1. 0
      Gary
      1. 0

        if Operation mit einem Scalar und einem fix-Wert

        Gary
        1. 0
          Matti Maekitalo
          1. 0

            if Operation erledigt!

            Gary
            1. 0
              Matti Maekitalo
              1. 0

                open - Modi?

                Gary
                1. 0
                  Struppi
                  1. 0

                    open - Erledigt!

                    Gary
                    1. 0
                      Struppi
                      1. 0
                        Gary
                        1. 0

                          Allgemeine Frage zu sub

                          Gary
                          1. 0
                            Matti Maekitalo
                            1. 0

                              stopper - aber wie?

                              Gary
                              1. 0
                                Gary
                                1. 0
                                  Struppi
                                  1. 0

                                    exit - erledigt

                                    Hi Struppi
                                    1. 0
                                      Struppi
                                      1. 0

                                        while - Ausstieg

                                        Gary
                                        1. 0
                                          Struppi
                                          1. 0

                                            Kopfnuss - zum Hirnen!

                                            Gary
                                            1. 0
                                              Jean-Max
                                              1. 0

                                                Altersanzeige komplett!

                                                Gary
                                                1. 0
                                                  Jean-Max
                                                  1. 0
                                                    CPAN
                                                    1. 0
                                                      Jean-Max
                                                      1. 0
                                                        Gary
                                                        1. 0

                                                          Kalender Modul Fragen?

                                                          Gary
                                                          1. 0
                                                            Struppi
                                                            1. 0
                                                              Gary
                                                              1. 0
                                                                Struppi
                                                                1. 0

                                                                  Date::Calc läuft!

                                                                  Gary
                                                                  1. 0
                                                                    Matti Maekitalo
                                                                    1. 0
                                                                      Gary
                                                                      1. 0

                                                                        Date Format erledigt!

                                                                        Gary
                                                                        1. 0

                                                                          kleiner als minus? Plusminus?

                                                                          Gary
                                                                          1. 0
                                                                            Matti Maekitalo
                                                                            1. 0
                                                                              Gary
                                                                              1. 0
                                                                                Gary
                                                                                1. 0

                                                                                  Letzter Akt - Speichern / Kopieren - wie am Sinnvollsten?

                                                                                  Gary
                                                                                  1. 0

                                                                                    Speichern mit generiertem Zusatz...

                                                                                    Gary
                                                                                    1. 0
                                                                                      Struppi
                                                                                      1. 0
                                                                                        Gary
                                                                                        1. 0
                                                                                          Struppi
                                                                                          1. 0

                                                                                            Alles erledigt - Thread beendet - Großes Danke!

                                                                                            Gary
                                                                              2. 0
                                                                                Der Martin
                                                                  2. 0
                                                                    Struppi
                                                              2. 0
                                                                Jean-Max
  2. 0
    Struppi
    1. 0

      Erledigt!

      Gary
      1. 0
        hotti
        1. 0
          Gary

Hallo zusammen

Nachdem man mir nahegelegt hatte, weniger goto und mehr sub's zu nutzen
(Was beim anderen Perlprog bereits für viel mehr übersichtlichkeit gesorgt hat - Danke!) gibt es jetzt wohl doch einschränkungen der sub's:

Perlcode:
-----------------------------------------------------
#####################

Datenbankfreigabe

#####################
open(FIRSTCONTROL, "<KDB-Data/key-guard.csv");
flock(FIRSTCONTROL, LOCK_EX);
my $Abus = <FIRSTCONTROL>;
if($Abus eq "busy"){
                   close FIRSTCONTROL;
                   Besetzt();
                   }
if($Abus eq "free"){
                   print FIRSTCONTROL busy;
                   close FIRSTCONTROL;
                   }
-----------------------------------------------------

Das Gibt die Fehlermeldung:

Bareword "LOCK_EX" not allowed while "strict subs" in use at /usr/lib/cgi-bin/Kundeneu.pl line 95.
Bareword "busy" not allowed while "strict subs" in use at /usr/lib/cgi-bin/Kundeneu.pl line 102.
Execution of /usr/lib/cgi-bin/Kundeneu.pl aborted due to compilation errors.

Das heisst wohl, daß ich kein File im Modus EX öffnen darf, wenn dannach ein Unterprogramm (sub) folgt?
Das wäre ja völliger blödsinn!

Gruß Gary

  1. Andere Leute werden dir die Fehlerursache erklären. Meine Antwort bezieht sich auf deinen Stil, der ganz grauenhaft ist. Modernes Perl schreibt man so:

      
    use 5.010;  
    use strict;  
    use warnings FATAL => 'all';  
    use autodie qw(:all);  
    use Fcntl qw(:flock);  
      
    {  
        # am Ende dieses Gültigkeitsbereiches wird $handle  
        # automatisch geschlossen und entlockt  
        open my $handle, '<', 'KDB-Data/key-guard.csv';  
        flock $handle, LOCK_EX;  
        my $a_bus = <$handle>;  
        given ($a_bus) {  
            when ('busy') { Besetzt(); }  
            when ('free') { print {$handle} 'busy'; }  
        }  
    }  
    
    

    Bitte lege dir perlcritic und PBP zu.

    1. Hi CPAN

      [...] Meine Antwort bezieht sich auf deinen Stil, der ganz grauenhaft ist.

      Äm- mein Perlstil hat sich die letzten Tage doch stark verbessert - finde ich. Geht vom Stil her stark nach Basic - > vom Ablauf in eine Richtung... schön Eines nach dem Anderen....

      Modernes Perl schreibt man so:

      use 5.010;
      use strict;
      use warnings FATAL => 'all';
      use autodie qw(:all);
      use Fcntl qw(:flock);

      {
          # am Ende dieses Gültigkeitsbereiches wird $handle
          # automatisch geschlossen und entlockt
          open my $handle, '<', 'KDB-Data/key-guard.csv';
          flock $handle, LOCK_EX;
          my $a_bus = <$handle>;
          given ($a_bus) {
              when ('busy') { Besetzt(); }
              when ('free') { print {$handle} 'busy'; }
          }
      }

        
      Das ist ja gar nicht wie in der Dokumentation. Sieht nach HardCoreScripting aus...  
      Nicht falsch verstehen - ich bin wirklich erstaunt wie man da noch mitkommt...  
        
      Einfaches Perl ist für mich aber völlig ausreichend - erwürdiger Meister!! \*respect\*  
        
      Gruß Gary
      
      1. Hi nochmal *ich mach es auch kurz*

        der relevante Perlteil:
        -------------------------------------------------
        open(FIRSTCONTROL, "<KDB-Data/key-guard.csv");
        flock(FIRSTCONTROL, LOCK_EX);
        my $Abus = <FIRSTCONTROL>;
        print $Abus;
        if($Abus eq "busy"){
                           close (FIRSTCONTROL);
                           Besetzt();
                           }
        if($Abus eq "free"){
                           print FIRSTCONTROL "busy";
                           close (FIRSTCONTROL);
                           }
        print $Abus;
        -------------------------------------------------

        Ich lasse mir den ausgelesenen Wert vor und nach dem If-Block zur Kontrolle Ausgeben. Wertauslesen aus key-guard funktioniert. Ergebnis: Der If-Block geht nicht. Der Skalar $Abus ist auf jeden Fall befüllt! Es muss am Vergleich liegen. Für Zahlen nimmt man == und für Strings eq. das habe ich gemacht.

        Auch wenn ich das so machen:
        -------------------------------------------------
        my $WertA = "busy";
        my $WertB = "free";
        if($Abus eq $WertA){
                           close (FIRSTCONTROL);
                           Besetzt();
                           }
        if($Abus eq $WertB){
                           print FIRSTCONTROL "busy";
                           close (FIRSTCONTROL);
                           }
        -------------------------------------------------
        geht es trotzdem nicht. Er springt wenn busy drin steht nicht zum sub-Programm "Besetzt();"

        Ich grübel schon ne ganze weile - fällt mir einfach nichts mehr ein. Vom Syntax her müsste alles stimmen...

        Gruß Gary

        1. Tach auch.

          my $Abus = <FIRSTCONTROL>;
          print $Abus;
          if($Abus eq "busy"){

          in $Abus wird dann sowas drinstehen wie etwa "busy\n" (oder ein deinem System angepasster Zeilentrenner), kurz: es ist ein Zelenendezeichen am Stringende.

          perldoc -f chomp

          Bis die Tage,
          Matti

          1. Hi Matti

            perldoc -f chomp

            Jetzt so:
            ---------------------------------------------
            chomp($Abus);
            if($Abus eq "busy"){
                               close (FIRSTCONTROL);
                               Besetzt();
                               }
            if($Abus eq "free"){
                               print FIRSTCONTROL "busy";
                               close (FIRSTCONTROL);
                               }
            ---------------------------------------------

            Alles ok!

            Danke, das war der springende Punk bzw. der "unsichtbare Feind" der if-Anweisung. Hier wird man echt zum Sherlock Holmes!

            Viele Grüße

            Gary

            1. Tach auch.

              Danke, das war der springende Punk bzw. der "unsichtbare Feind" der if-Anweisung. Hier wird man echt zum Sherlock Holmes!

              Es war eine gute Idee, mit print $Abus; dir den Wert anzusehen, der da drin steckt. Aber gerade die Zeilenumbrüche (oder Tabulatoren am Zeilenende, ...) sind da leicht zu übersehen. Deswegen mache ich bei solchen Testausgaben entweder eindeutige Trennzeichen um die Ausgabe (also etwa print "###$Abus###"; oder nutze ein Perl-Modul, welches mir komplexe Datenstrukturen aufbereitet anzeigt:

                
              use Data::Dumper;  
              print Dumper($Abus);
              

              Ist für einen einzelnen Skalar etwas oversized, aber für größere Datenstrukturen sehr praktisch.

              Bis die Tage,
              Matti

              1. Abend zusammen

                Kniffliges Problem (!)

                Wenn man ein File mit "<" öffnet = nur lesen.
                Wenn man ein File mit ">" öffnet = nur schreiben.
                Wenn man ein File mit "+<" öffnet = lesen und schreiben File muss existieren.
                Wenn man ein File mit "<" öffnet = lesen und schreiben File wird überschrieben.

                Bei "+<" kann ich den Inhalt auslesen und was Neues dazu schreiben. Allerdings werden die neuen Daten unter die alten geschrieben.

                Bei "+>" kann ich den Inhalt nicht vorher auslesen weil der direkt beim öffnen zerstört wird.

                Es geht um das File key-guard.csv, dort steht Bsp. "free" drin.
                Das Perl-Script soll die key-guard.csv auslesen. Ist dort "free", dann soll es "busy" hinein schreiben und die Datei schließen.

                Ziel soll sein, daß immer nur ein Wort in der key-guard.csv steht. "busy" oder "free". Nicht eine Liste:

                busy
                free
                busy
                free
                usw...

                Kann man das realisieren, ohne die Datei nicht 2x öffnen und 2x schließen zu müssen?

                also nicht:

                open
                close
                open
                close...

                Gruß Gary

                1. Kniffliges Problem (!)

                  Das auch in der Doku beschrieben wird.
                  Du suchst seek und/oder truncate

                  Struppi.

                  1. Hi Struppi

                    Das auch in der Doku beschrieben wird.
                    Du suchst seek und/oder truncate

                    Genau - das suchte ich :-)

                    -----------------------------------------------
                    if($Abus eq "free"){
                                       seek(FIRSTCONTROL, 0, 0);
                                       print FIRSTCONTROL "busy";
                                       close (FIRSTCONTROL);
                                       }
                    -----------------------------------------------

                    Danke und Grüsse

                    Gary

                    1. Das auch in der Doku beschrieben wird.
                      Du suchst seek und/oder truncate

                      Genau - das suchte ich :-)


                      if($Abus eq "free"){
                                         seek(FIRSTCONTROL, 0, 0);
                                         print FIRSTCONTROL "busy";
                                         close (FIRSTCONTROL);
                                         }

                      Das funktioniert aber nur, weil beide Wörter zufällig gleich viele Buchstaben haben.

                      Struppi.

                      1. Abend Struppi


                        if($Abus eq "free"){
                                           seek(FIRSTCONTROL, 0, 0);
                                           print FIRSTCONTROL "busy";
                                           close (FIRSTCONTROL);
                                           }

                        Das funktioniert aber nur, weil beide Wörter zufällig gleich viele Buchstaben haben.

                        Hehe - Glück gehabt. Ich hab schon angefangen zu schwitzen, als ich was von Binärer Position gelesen habe. Ich habe gelesen, daß der 3. Parameter aussagt, von wo ab gezählt wird (= von Anfang an). Beim 2. parameter habe ich *geraten* und "Null" eingesetzt. Das war für mich aus der Doku nicht ersichtlich:

                        ----------------------------------------------
                        seek(HANDLE,Positionswert,ABSOLUT-RELATIV-VOMENDE);

                        Der Befehl seek setzt den Dateizeiger eines Dateihandles, das vorher mit open erzeugt wurde, an eine neue, beliebige Stelle.
                        Dazu werden folgende Parameter verwendet:
                        1. Parameter: Das Handle der geöffneten Datei.
                        2. Parameter: Die Byteposition innerhalb der Datei, abhängig von der im dritten Parameter angegebenen Bezugsposition
                        3. Parameter: Bezugsposition für die Angabe im zweiten Parameter.
                        Diese kann die Werte 0, 1 oder 2 haben:

                        • 0 bedeutet absolut vom Dateianfang (Position 0) aus gerechnet,
                        • 1 bedeutet relativ vom der aktuellen Position des Dateizeigers aus gerechnet,
                        • 2 bedeutet absolut vom Dateiende gerechnet (im Normalfall sollte die Angabe beim zweiten Parameter in diesem Fall eine negative Zahl sein).
                          ----------------------------------------------

                        Danke und Gruß

                        Gary

                        1. Morgen zusammen

                          Klingt vielleicht ein wenig blöd, aber habe es nirgens explizit gelesen:

                          Wenn mit:
                          -------------------
                          SuperProgramm();
                          -------------------

                          eine Subroutine aufgerufen wird, und das laufende Programm dann die Stelle:

                          -------------------
                          sub Superprogramm
                          -------------------

                          anspringt und abarbeitet - was macht sub dannach? Endet es mit dem letzten Befehl in den geschweiften Klammern, oder springt es an die Stelle im laufendem Programm, von der es aufgerufen wurde?

                          Gruß Gary

                          1. Tach auch.

                            Wenn mit [...] eine Subroutine aufgerufen wird, und das laufende Programm dann die Stelle [...] anspringt und abarbeitet - was macht sub dannach? Endet es mit dem letzten Befehl in den geschweiften Klammern, oder springt es an die Stelle im laufendem Programm, von der es aufgerufen wurde?

                            Wenn du mit dem ersten Halbsatz meinst, dass das Programm mit dem letzten Befehl in den geschweiften Klammern endet: Nein.

                            Das Programm springt an die Stelle, wo die Prozedur aufgerufen wurde (und "vergisst" alle lokalen Variablen u.ä.).

                            Bis die Tage,
                            Matti

                            1. Hi Matti

                              Das Programm springt an die Stelle, wo die Prozedur aufgerufen wurde

                              Mist, daß dachte ich mir. Es sieht so aus:
                              ------------------------------------------------------
                              if($Abus eq "busy"){
                                                 close (FIRSTCONTROL);
                                                 Besetzt();
                                                 }

                              exit(0);  # <<-- Hier muss ein Stopper rein! z. B. Exit? <<

                              if($Abus eq "free"){
                                                 seek(FIRSTCONTROL, 0, 0);
                                                 print FIRSTCONTROL "busy";
                                                 close (FIRSTCONTROL);
                                                 }
                              ------------------------------------------------------

                              Kann ich das so machen? Laut Perldoc ist der Wert in der Klammer für alles in Ordnung eine "0" also "exit(0);

                              Gruß Gary

                              1. Hi Matti

                                Halt, geht ja so gar nicht. Dann würde die zweite if-Anweisung quasie "nie" ausgeführt.

                                ------------------------------------------------------
                                if($Abus eq "busy"){
                                                   close (FIRSTCONTROL);
                                                   Besetzt();
                                                   exit(0);
                                                   }

                                if($Abus eq "free"){
                                                   seek(FIRSTCONTROL, 0, 0);
                                                   print FIRSTCONTROL "busy";
                                                   close (FIRSTCONTROL);
                                                   }
                                ------------------------------------------------------

                                Aber vielleicht so?

                                Gruß Gary


                                1. if($Abus eq "busy"){
                                                     close (FIRSTCONTROL);
                                                     Besetzt();
                                                     exit(0);
                                                     }

                                  if($Abus eq "free"){
                                                     seek(FIRSTCONTROL, 0, 0);
                                                     print FIRSTCONTROL "busy";
                                                     close (FIRSTCONTROL);
                                                     }

                                  Aber vielleicht so?

                                  Du schienst wirklich grosse Schwierigkeiten mit der heutzutage üblichen funktionalen Programmierung zu haben. exit solltest du vermeiden, da ähnlich wie bei goto in deinem Programmcode der ablauf unterbrochen wird und du ab einer bestimmten Programmgröße solche Stellen u.U. schwer findest.

                                  Dein Beispielcode könnte z.b. mit elsif verbessert werden.

                                  if($Abus eq "busy"){  
                                                      close (FIRSTCONTROL);  
                                                      Besetzt();  
                                  } elsif($Abus eq "free"){  
                                                      seek(FIRSTCONTROL, 0, 0);  
                                                      print FIRSTCONTROL "busy";  
                                                      close (FIRSTCONTROL);  
                                  }  
                                  
                                  

                                  Dann könntest du dir auch das doppelt close sparen.

                                  Struppi.

                                  1. Hi Struppi

                                    [...] exit solltest du vermeiden, da ähnlich wie bei goto in deinem Programmcode der ablauf unterbrochen wird und du ab einer bestimmten Programmgröße solche Stellen u.U. schwer findest.

                                    Goto habe ich ja bereits nach Hause geschickt! Das brachte der Übersichtlichkeit meiner Programme einen immensen Gewinn!

                                    Zu exit(0);

                                    Wenn deine Schwiegereltern an der Haustür klingeln, während du am Poppen bist, wirst du wohl oder übel auch unterbrechen müssen...

                                    ..Du siehst also - Unterbrechnungen sind etwas ganz natürliches! >:->

                                    Merke: Auch kleine unschuldige exit-Anweisungen haben ihre Daseinsberechtigung  *lol*

                                    Viele Grüße Gary

                                    PS.: Mit Exit funktioniert das Script einwandfrei. Zumindest das erste von insgesammt sieben läuft nun!*stöhn*

                                    1. Zu exit(0);

                                      Wenn deine Schwiegereltern an der Haustür klingeln, während du am Poppen bist, wirst du wohl oder übel auch unterbrechen müssen...

                                      ..Du siehst also - Unterbrechnungen sind etwas ganz natürliches! >:->

                                      Das ist ein gutes Beispiel. Ich glaube diese Kombination ist in aller Regel die absolute Ausnahmem, d.h. exit sollte ebenfalls die absolute Ausnahmebleiben und ich glaube auch das im Leben der meisten Menschen dein Beispiel nie zutreffen wird, genau das sollte auch das Ziel bei der Verwendung von exit sein.

                                      Merke: Auch kleine unschuldige exit-Anweisungen haben ihre Daseinsberechtigung  *lol*

                                      Ja, in ganz wenigen Ausnahmefällen.

                                      PS.: Mit Exit funktioniert das Script einwandfrei. Zumindest das erste von insgesammt sieben läuft nun!*stöhn*

                                      Ein Skript dass irgendwo im Programmcode beendet wird, würde ich nicht als funktionierend bezeichnen. Bei mir geschieht sowas i.d.R. nur im Fehlerfall mit einem die (was man ebenfalls abfangen sollte)

                                      Struppi.

                                      1. Hi Struppi

                                        Vor der Raucherpause noch eins - weil's grad so schön flutscht:
                                        ---------------------------------------------------------------------------
                                        while(! eof(CUSTOMER)){
                                             my $searchzeile = <CUSTOMER>;
                                             my ($anrede, $dbkundennummer, $vorname, $name, $geboren, $hausnummer, $land, $plz, $ort, $telefon, $fax, $mobil, $bank, $blz, $konto, $inhaber) = split(/;/,$searchzeile);
                                             if($dbkundennummer eq $kundennummer){
                                                                                 Datengeber();
                                                                                 }
                                                              }
                                        close(CUSTOMER);
                                        ---------------------------------------------------------------------------

                                        Das Konstrukt liest zeilenweise ein. Und vergleicht die $kundennummer die der User eingegeben hat mit der ausgelesenen $dbkundennummer. Wenn sie identisch ist -> Sprung zu Datengeber(); ...

                                        Um es vorweg zu nehmen. Das Konstrukt funktioniert! Unschön ist, daß auch wenn die gesuchte Kundennummer gefunden wurde, läuft die while -Schleife weiter - obwohl dann eigentlich überflüssig!

                                        Ist es legitim, unterhalb von Datengeber(); mit einem (verbotenen) goto-Sprung die Schleife im Fall der Fälle zu verlassen?

                                        Gruß Gary

                                        1. Ist es legitim, unterhalb von Datengeber(); mit einem (verbotenen) goto-Sprung die Schleife im Fall der Fälle zu verlassen?

                                          Nein. http://perldoc.perl.org/functions/last.html

                                          Struppi.

                                          1. Hi Struppi

                                            Nein. http://perldoc.perl.org/functions/last.html

                                            Gut :-)

                                            War fleissig gewesen und habe schon folgendes erreicht, um das aktuelle Alter des Kunden live auszurechnen:

                                            Das Geburtsdatum des Kunden liegt bereits schön serviert in folgenden Skalaren parat:

                                            $dbtag (Bsp."01")
                                            $dbmonat (Bsp."12")
                                            $dbJahr (Bsp."1980")

                                            Das aktuelle Datum liegt ebenfalls schön aufbereitet vor:

                                            $Monatstag (Bsp."26")
                                            $Monat (Bsp."08")
                                            $Jahr (Bsp."2010")

                                            Wie berechne ich das genaue Alter? Einfach die Jahre abziehen geht nicht. Sonst wäre er schon 30, obwohl er erst im Dezember Geburtstag hätte. Die Einzelwerte voneinander abziehen geht ja auch nicht, da diese manchmal kleiner als der abzuziehende Wert ist... :-(

                                            Ich brauche das für die Ausgabe des Alters in der Ausgabemaske, so daß der Bearbeiter auch gleich das aktuelle Alter des Kunden sieht....

                                            Gruß Gary

                                            1. Bounjoun Gary,

                                              $dbtag (Bsp."01")
                                              $dbmonat (Bsp."12")
                                              $dbJahr (Bsp."1980")

                                              Das aktuelle Datum liegt ebenfalls schön aufbereitet vor:

                                              $Monatstag (Bsp."26")
                                              $Monat (Bsp."08")
                                              $Jahr (Bsp."2010")

                                              Wie berechne ich das genaue Alter?

                                              Du kannst dazu mein Date::Today-Modul benutzen.

                                              Adiou.

                                              1. Hi Jean-Max

                                                Habe es hinbekommen:
                                                -------------------------------------------------------
                                                $alter = $Jahr - $dbjahr;
                                                if($Monat > $dbmonat){
                                                                     $alter = $alter - 1;
                                                                     }
                                                if($Monat = $dbmonat and $Monatstag < $dbtag) {
                                                                                              $alter = $alter -1;
                                                                                              }
                                                -------------------------------------------------------

                                                So wird ab dem Geburtstag das richtige Alter angezeigt

                                                Def.:
                                                $Monatstag -> aktuell
                                                $Monat -> aktuell
                                                $Jahr -> aktuell

                                                $dbtag -> aus DB
                                                $dbmonat -> aus DB
                                                $dbjahr -> aus DB

                                                zu deinem Modul:
                                                Das ist ein Mords Teil *staun* Ich glaube da brauche ich erst ein Studium um es richtig und vollends bedienen zu können. Sorry - nicht böse sein, aber das ist so als wenn ich eine 747 fliegen müsste...

                                                Grüße Gary

                                                1. Bounjoun Gary,

                                                  $dbtag -> aus DB
                                                  $dbmonat -> aus DB
                                                  $dbjahr -> aus DB

                                                  zu deinem Modul:
                                                  Das ist ein Mords Teil *staun*

                                                  Keineswegs...

                                                  Ich glaube da brauche ich erst ein Studium um es richtig und vollends bedienen zu können. Sorry - nicht böse sein, aber das ist so als wenn ich eine 747 fliegen müsste...

                                                  Du musst Dir nur die Methoden aussuchen, die Du brauchst, z.B. get_age() für das Alter.

                                                  Modul einbiden[1]:

                                                  use Date::Today;

                                                  Instanz erstellen:

                                                  my $t = Date::Today->new('de'); # Sprache Deutsch

                                                  Methode get_age() benutzen:

                                                  my $ageOfCustomerX = $t->get_age($dbjahr,$dbmonat,$dbtag);

                                                  [1] Das Modul »Today.pm« ins Verzeichnis kopieren, wo auch Date::Calc ist, i.d.R bei Windows: LAUFWERK:\Perl\lib\Date

                                                  Adiou.

                                                  1. DateTime/DateTime::Format::CLDR sind überlegen.

                                                    1. Bounjoun CPAN,

                                                      DateTime/DateTime::Format::CLDR sind überlegen.

                                                      Ich bin kein Szeneinsider. Nach dem ich Date::Calc als für meine Zwecke Overkill empfand, habe ich das Modülchen geschrieben. Das war für mich Übung und hat Spaß gemacht.

                                                      Dass andere überlegen sind, was soll ich dazu sagen, ist doch klar, oder? Es gibt immer jemand, irgendwas, das einem, seinem Tun überlegen ist. Und im Bezug auf mich und Perl, ist es nicht schwer, überlegen zu sein.

                                                      Adiou.

                                                      1. Hallo zusammen

                                                        Die drei ersten Funktionen der DB sind fertig und laufen fehlerfrei (mit funktionen sind die Radiobuttons gemeint).

                                                        Bleiben noch vier weitere Perlscripte zum Schreiben. Wobei wenn wir ehrlich sind drei - da die Kopiefunktion wahrscheinlich Pillepalle ist...

                                                        Grüße und Gute Nacht

                                                        Gary

                                                        1. Schönen Samstag zusammen

                                                          Nun laufen die ersten 4-Radiobuttons einwandfrei. Für die nächsten beiden Punkte:

                                                          1. Auslaufende Verträge auflisten

                                                          2. Geburtstage in einer Woch auflisten

                                                          werde ich wohl kaum an einem zusätliches Modul vorbei kommen.
                                                          Was bei der Altersberechnung noch mit if-Anweisungen zu berechnen war, wird bei Absolutwerten rückwärtsrechnen wohl nicht ohne leistungstarkes Modul gehen (muss wahrscheinlich ein Kalender eingebaut sein, um entsprechende Tage zurück gehen zu können.)

                                                          Zu 1)
                                                          Da ist in der DB immer eine Frist angegeben. Beispielsweise 30 für 30 Tage. Da sollte der Filter noch 14 Tage Reserve draufrechnen. Also insgesamt 44 Tage. Dann sollte der Filter vom DB-Wert "Ablauf" diese 44 Tage abziehen. Ist der heutige Zeitpunk mehr als 44 Tage vom Ablauf entfernt passiert nichts. Ist der heutige Teitpunkt 44 Tage oder weniger vom Ablauf entfernt, dann Vertrag anzeigen...

                                                          Das gibt mit sicherheit die schwierigste Operation in dieser DB!

                                                          Zu 2)
                                                          Da habe ich etwas Glück. Wenn das Problem zu 1 erledigt ist, kann ich acu das zu 2 erledigen - ist fast dasselbe in hellgrün...

                                                          Das hier von Struppi:

                                                          DateTime/DateTime::Format::CLDR sind überlegen.

                                                          dürfte also für sowas geeignet sein?
                                                          Ist eines davon Standard? Also schon in Perl drin?

                                                          Viele Grüße

                                                          Gary

                                                          1. Das hier von Struppi:

                                                            Nee, das ist von CPAN, ich benutze Date::Calc

                                                            Ist eines davon Standard? Also schon in Perl drin?

                                                            Kommt drauf an welche Version du hast. Aber warum probierst du es nicht aus?

                                                            Struppi.

                                                            1. Hi zusammen

                                                              Habe das Modul Date::Calc heruntergeladen und nach dieser anweisung installiert:

                                                              Installation:
                                                              -------------

                                                              perl Makefile.PL
                                                              make
                                                              make test
                                                              make install UNINST=1

                                                              Natürlich mit sudo vorangestellt, da es ohne Fehlermeldungen gab, die auf mangelnde Berechtigungen zurückzuführen waren.

                                                              Der Perl Code:
                                                              --------------------------------------------------------------------------
                                                              #!/usr/bin/perl -w
                                                              use strict;
                                                              use CGI -no_xhtml;
                                                              use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
                                                              use Fcntl ':flock';
                                                              use Date::Calc qw(:all);

                                                              print CGI->header('text/html');
                                                              print qq(<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">),"\n";
                                                              print qq(<html>),"\n";
                                                              print qq(<head>),"\n";
                                                              print qq(<meta http-equiv="Content-Language" content="de">),"\n";
                                                              print qq(<meta http-equiv="Content-Type" content="text/html; charset=utf-8">),"\n";print qq(</head>),"\n";
                                                              print qq(<body>),"\n";
                                                              print qq(<p>Hallo - hier ist Perl!</p>);
                                                              print qq(</body>),"\n";
                                                              print qq(</html>),"\n";
                                                              --------------------------------------------------------------------------

                                                              Und die Fehlermeldung im Browser:
                                                              --------------------------------------------------------------------------
                                                              Can't locate Carp/Clan.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.10.0 /usr/local/share/perl/5.10.0 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl .) at /usr/local/share/perl/5.10.0/Date/Calc/PP.pm line 18.
                                                              BEGIN failed--compilation aborted at /usr/local/share/perl/5.10.0/Date/Calc/PP.pm line 18.
                                                              Compilation failed in require at /usr/local/share/perl/5.10.0/Date/Calc.pm line 37.
                                                              BEGIN failed--compilation aborted at /usr/local/share/perl/5.10.0/Date/Calc.pm line 43.
                                                              Compilation failed in require at /usr/lib/cgi-bin/ModulTest.pl line 6.
                                                              BEGIN failed--compilation aborted at /usr/lib/cgi-bin/ModulTest.pl line 6.
                                                              --------------------------------------------------------------------------

                                                              Ich krieg jetzt echt die Krise... hab eine echt gute Seite zur Handhabung des Modules gefunden und scheitere bereits bei der Installation desselben *gumpf*

                                                              Wenn jemand eine Vermutung hat, wo ich wie drehen muss - nur her damit!

                                                              Ich geh mal eine Rauchen um wider runter zu kommen ;-)

                                                              Gruß Gary

                                                              1. Habe das Modul Date::Calc heruntergeladen und nach dieser anweisung installiert:

                                                                Wieso runtergeladen? Es gibt Paketmanager für CPAN Module, je nach Betriebsystem, bei dir klingt es nach Linux, also dürfte cpan oder cpanp installiert sein. Wenn du alles von Handinstallieren willst, musst du dich um die Abhängigkeiten kümmern.

                                                                Struppi.

                                                                1. Hallo ihr zwei ;-)

                                                                  Habe dies gemacht:
                                                                  ---------------------------------------------------------------------
                                                                  sudo cpan

                                                                  Terminal does not support AddHistory.
                                                                  cpan shell -- CPAN exploration and modules installation (v1.9402)
                                                                  Enter 'h' for help.

                                                                  cpan[1]> install Date::Calc
                                                                  ---------------------------------------------------------------------

                                                                  Und als das nicht gefruchtet hat dies hier:
                                                                  ---------------------------------------------------------------------
                                                                  sudo apt-get install libdate-calc-perl

                                                                  [sudo] password for xxx:

                                                                  Paketlisten werden gelesen... Fertig
                                                                  Abhängigkeitsbaum wird aufgebaut
                                                                  Status-Informationen einlesen... Fertig
                                                                  Die folgenden zusätzlichen Pakete werden installiert:
                                                                    libbit-vector-perl libcarp-clan-perl
                                                                  Die folgenden NEUEN Pakete werden installiert:
                                                                    libbit-vector-perl libcarp-clan-perl libdate-calc-perl
                                                                  0 aktualisiert, 3 neu installiert, 0 zu entfernen und 22 nicht aktualisiert.
                                                                  Es müssen 462kB an Archiven heruntergeladen werden.
                                                                  Nach dieser Operation werden 1.536kB Plattenplatz zusätzlich benutzt.

                                                                  Möchten Sie fortfahren [J/n]?
                                                                  ---------------------------------------------------------------------

                                                                  Und dannach Fehlermeldung weg!

                                                                  Das bedeutet ich habe jetzt offiziell Date::Calc am Start.
                                                                  Problematisch dürfte es werden, wenn man diese ganzen Umgebungbedingungen auf einem anderen System zusammenbauen muss, damit die Software läuft.

                                                                  Das war und ist halt ein riesen Vorteil von fest eingebauten Basic gewesen. Ein geschriebenes Programm konnte man überall hin mitnehmen und es war lauffähig...

                                                                  Gruß und Gute Nacht

                                                                  Gary

                                                                  1. Tach auch.


                                                                    sudo cpan
                                                                    cpan[1]> install Date::Calc
                                                                    Und als das nicht gefruchtet hat [...]

                                                                    Was hat denn hier nicht funktioniert? Denn immerhin ist dies der "beste" Weg, um eine aktuelle Modul-Distribution zu bekommen. Dein Leben wird sich erleichtern, wenn du damit zurechtkommst.

                                                                    Bis die Tage,
                                                                    Matti

                                                                    1. Hallo zusammen

                                                                      Ich habe hier folgenden Schnipsel:
                                                                      --------------------------------------------
                                                                      ###########################

                                                                      Ablaufdatum - Splitting

                                                                      ###########################

                                                                      my $dbtag = substr($ablauf, 0, 2);
                                                                      my $dbmonat = substr($ablauf, 3, 2);
                                                                      my $dbjahr = substr($ablauf, 6, 4);

                                                                      #################

                                                                      Datum - Heute

                                                                      #################
                                                                      ($year,$month,$day) = Today();
                                                                      --------------------------------------------
                                                                      Ablaufsplitting ist nötig, da das Datum als String so vorliegt:"26.08.2010".
                                                                      Das funktioniert auch einwandfrei.

                                                                      Die Funktion Today liefert mir den heutigen tag so:"29.8.2010"

                                                                      So jetzt kommts:
                                                                      Für eine Funktion die weiter unten folgt, darf aber das Datum aus der Datenbank keine führenden Nullen haben. Also statt:

                                                                      $dbtag = 26
                                                                      $dbmonat = 08
                                                                      $dbjahr = 2010

                                                                      Darf das Datum bei Tag und Monat nur so sein:

                                                                      $dbtag = 26
                                                                      $dbmonat = 8 <-- _nicht "08"
                                                                      $dbjahr = 2010

                                                                      Ich wollte da was mit substr basteln:
                                                                      ---------------------------------------------------------------------------
                                                                      if (substr($ablauf, 0, 1) eq 0){
                                                                                                     lösch die erste Zahl und pack das in $dbtag
                                                                                                     }
                                                                      if (substr($ablauf, 3, 1) eq 0){
                                                                                                     lösch die erste Zahl und pack das in $dbmonat
                                                                                                     }
                                                                      ---------------------------------------------------------------------------

                                                                      Also wie lösche ich eine durch substr ermittelte Stelle in einem Skalar?

                                                                      1. Hi nochmal

                                                                        ---------------------------------------------------------------------------

                                                                        if (substr($ablauf, 0, 1) eq 0){
                                                                                                       $dbtag = substr($ablauf, 1, 1);
                                                                                                       }
                                                                        if (substr($ablauf, 3, 1) eq 0){
                                                                                                       $dbmonat = substr($ablauf, 4, 1);
                                                                                                       }

                                                                        So müsste es gehen - das mir das nicht gleich eingefallen ist *tz*

                                                                        Ich übergebe einfach ohne null!

                                                                        Gruß Gary

                                                                        1. Hi zusammen

                                                                          Die Auswertung von negativen Zahlen bereitet mir Schwierigkeiten - Mathe ist nicht mein Fachgebiet *g*...

                                                                          Also ich möchte eine If-Abfrage machen, in der der Anweisungsblock in den geschweiften Klammern ausgeführt werden soll, wenn:

                                                                          Den Skalar $Dd (DeltaDate) diese Werte hat:
                                                                          -7
                                                                          -6
                                                                          -5
                                                                          -4
                                                                          -3
                                                                          -2
                                                                          -1
                                                                          0

                                                                          Also von minus sieben (-7) bis _einschließlich_ Null (0) in $Dd vorhanden ist, dann Anweisungsblock durchführen.

                                                                          Mit einzelnen If-Anweisungen wär das möglich (dann wären das aber 8 einzelne If-Anweisungen. Mit < oder > ? Das Minus vornedran verwirrt mich etwas.

                                                                          Ist "kleiner als" minus7 "kleiner als" Null? Plus/Minus?

                                                                          -> Ich glaub ich brauche ne Pause *an-den-Kopf-fassend*...

                                                                          Gruß

                                                                          Gary

                                                                          1. Tach auch.

                                                                            Den Skalar $Dd (DeltaDate) diese Werte hat:
                                                                            -7..0

                                                                            if (-7 <= $dd && $dd <= 0) {

                                                                            }

                                                                            Ist "kleiner als" minus7 "kleiner als" Null?

                                                                            -7 < 0

                                                                            Bis die Tage,
                                                                            Matti

                                                                            1. Hi Matti

                                                                              Den Skalar $Dd (DeltaDate) diese Werte hat:
                                                                              -7..0

                                                                              if (-7 <= $dd && $dd <= 0) {

                                                                              }

                                                                              if ($Dd <= 0 and $Dd > -7) {
                                                                                                         }

                                                                              Hab das jetzt so gemacht und getestet - funktioniert!

                                                                              Der erste Teil ist wie dein hinterer Teil - identisch.
                                                                              Dein vorderer Teil (-7<= SDd) finde ich verwirrend/abstrakt. Normal kommt doch erst der Skalar, und dann der Wert des Vergleiches...

                                                                              Und ob "&&" (kannte ich übrigens noch nicht) besser lesbar ist als das Schlüsselwort "and" ?

                                                                              Aber 'nem geschenkten Gaul, guckt man nicht ins Maul. Du hast mir auf jeden Fall geholfen diese Minus-Geschichte  umzusetzen.

                                                                              Merci Matti

                                                                              Gruß

                                                                              Gary

                                                                              1. Hi nochmal - korrektur:

                                                                                if ($Dd <= 0 and $Dd >= -7) {

                                                                                Gruß Gary

                                                                                1. Abend zusammen

                                                                                  Die Geburtstagskontrolle funktioniert _endlich_. Momentausgabe ist zusehen -> hier.

                                                                                  Und zum Schluß muss ich noch den Punkt "Sicherungskopie der DB erstellen" erledigen - dann fertig!

                                                                                  Es gibt da zwei Möglichkeiten:

                                                                                  A:
                                                                                  Ich öffen eine Datei, lese sie ein, und schließe diese. Ich öffne eine Datei an einem anderen Pfad und schreibe den eingelesenen Inhalt dort ein.

                                                                                  B:
                                                                                  Mit dem Copy-Modul:
                                                                                  -------------------------------------------------------
                                                                                  use File::Copy;

                                                                                  copy("file1","file2") or die "Copy failed: $!";

                                                                                  copy("Copy.pm",\*STDOUT);

                                                                                  move("/dev1/fileA","/dev2/fileB");

                                                                                  use File::Copy "cp";

                                                                                  $n = FileHandle->new("/a/file","r");

                                                                                  cp($n,"x");
                                                                                  -------------------------------------------------------
                                                                                  Ich brauch da wahrscheinlich nur das Modul "File::Copy" und das erste Beispiel darunter copy("file1","file2") or die "Copy failed: $!"

                                                                                  Was empfiehlt Ihr? Was gibt es zu beachten? Muss ich eventuelle Fehler bei diesem Copy-Vorgang bearbeiten / abfangen? usw...

                                                                                  Viele Grüße

                                                                                  Gary

                                                                                  1. Morgen allerseits...

                                                                                    Das mit der Sicherungskopie klappt nun. Sieht momentan so aus:

                                                                                    -----------------------------------------------
                                                                                    ##################

                                                                                    KDB-A kopieren

                                                                                    ##################
                                                                                    ($year, $month, $day) = Today();
                                                                                    print qq(<p>), $day;
                                                                                    print qq(-);
                                                                                    print $month;
                                                                                    print qq(-);
                                                                                    print $year;
                                                                                    print qq(</p>);
                                                                                    copy("KDB-Data/KDB-A.csv","KDB-Backup/Kopie-KDB-A.csv") or die "Copy failed: $!";
                                                                                    -----------------------------------------------

                                                                                    Anstatt nun immer das Backup unter "Kopie-KDB-A.csv" abzuspeichern, dachte ich mir wäre es ganz nett, das Datum der Speicherung in den Dateinamen einfließen zu lassen.

                                                                                    Aber irgendwie klappt es nicht, wenn ich die Skalare dort einfüge:

                                                                                    -------------------------------------------------------------------------
                                                                                    copy("KDB-Data/KDB-A.csv","KDB-Backup/Kopie-KDB-A, $day,"-", $month,"-", $year,.csv") or die "Copy failed: $!";
                                                                                    -------------------------------------------------------------------------
                                                                                    Ist es möglich, einen selbst generierten Dateinamen in der Funktion "Copy" zu verwenden?

                                                                                    Wenn ja, wie bekomme ich die Skalare in die Copy-Funktion?

                                                                                    Gruß Gary

                                                                                    1. ($year, $month, $day) = Today();

                                                                                      Wo ist das my?

                                                                                      print qq(<p>), $day;

                                                                                      Bist du sicher, dass du weißt was qq macht?
                                                                                      Warum schreibst du nicht:

                                                                                      print qq(<p> $day -$month- $year </p>);

                                                                                      Zum formatieren des Datums eignet sich auch sprintf sehr gut:

                                                                                      my $fmt_date = sprintf('%02d-%02d-%04d', $day, $month, $year);

                                                                                      und da du sicher das CGI Modul verwendest:

                                                                                      print CGI::p($fmt_date);

                                                                                      Aber irgendwie klappt es nicht, wenn ich die Skalare dort einfüge:


                                                                                      copy("KDB-Data/KDB-A.csv","KDB-Backup/Kopie-KDB-A, $day,"-", $month,"-", $year,.csv") or die "Copy failed: $!";

                                                                                      Jetzt hast du eine Liste von Dateien mit den Namen $day, '-', $month usw. die kopiert werden sollen. Das ist Unsinn.

                                                                                      Ist es möglich, einen selbst generierten Dateinamen in der Funktion "Copy" zu verwenden?

                                                                                      Natürlich.

                                                                                      z.b. so

                                                                                      copy("KDB-Data/KDB-A.csv","KDB-Backup/Kopie-KDB-A$fmt_date.csv") or die "Copy failed: $!";  
                                                                                      
                                                                                      

                                                                                      Was aber unübersichtlich ist. Besser wäre vielleicht sowas:

                                                                                      my $neue_datei = sprintf 'KDB-Backup/Kopie-KDB-A%s.csv', $fmt_date;  
                                                                                      copy('KDB-Data/KDB-A.csv', $neue_datei) or die "Copy failed: $!";  
                                                                                      
                                                                                      

                                                                                      Struppi.

                                                                                      1. Morgen Struppi ;-)

                                                                                        Wo ist das my?

                                                                                        Das steht natürlich weiter oben im Code. Bei meinen Scripten wird der
                                                                                        Deklaration im "Kopf" des Programms Aufmerksamkeit geschenkt. *g*
                                                                                        Hier ein kleiner Auszug über die Ordnung die bei mir herrscht:
                                                                                        --------------------------------------------------------
                                                                                        #################################

                                                                                        Skalare für Programmsteuerung

                                                                                        #################################
                                                                                        my $counter = 0;
                                                                                        #######################

                                                                                        Skalare aus Dateien

                                                                                        #######################
                                                                                        my $dbkundennummer;
                                                                                        #######################

                                                                                        Arrays aus Dateien

                                                                                        #######################
                                                                                        my @ListCollect;
                                                                                        ######################

                                                                                        Skalar Zeitstempel

                                                                                        ######################
                                                                                        my $DSIdentNr = time;
                                                                                        ###############

                                                                                        Datenfilter

                                                                                        ###############
                                                                                        $anrede =~ s/;//g;
                                                                                        $kundennummer =~ s/;//g;
                                                                                        $vorname =~ s/;//g;
                                                                                        $name =~ s/;//g;
                                                                                        $geboren =~ s/;//g;
                                                                                        --------------------------------------------------------

                                                                                        print qq(<p>), $day;

                                                                                        Bist du sicher, dass du weißt was qq macht?

                                                                                        Jo, mit dem "Doppelquot" kann ich jeglichen HTML-Code vom Quelltext in Perl rüberkopieren, ohne mir über Sonderzeichen Gedanken machen zu müssen. Ich hab das so verinnerlicht, daß ich es auch anwende, wenn ich es eigentlich gar nicht bräuchte. *g*

                                                                                        »» Zum formatieren des Datums eignet sich auch sprintf sehr gut:

                                                                                        my $fmt_date = sprintf('%02d-%02d-%04d', $day, $month, $year);

                                                                                        Aha, wieder was neues!

                                                                                        und da du sicher das CGI Modul verwendest:

                                                                                        print CGI::p($fmt_date);

                                                                                        Nein, ich verwende diese hier:
                                                                                        ----------------------------------------------------------------
                                                                                        use CGI -no_xhtml;
                                                                                        use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
                                                                                        use Fcntl ':flock';
                                                                                        use Date::Calc qw(Delta_Days);
                                                                                        use Date::Calc qw(Today);
                                                                                        use File::Copy;
                                                                                        ----------------------------------------------------------------
                                                                                        Und von Date::Calc auch nur die beiden, die ich brauche.

                                                                                        Jetzt hast du eine Liste von Dateien mit den Namen $day, '-', $month usw. die kopiert werden sollen. Das ist Unsinn.

                                                                                        Gott sei Dank nicht. Dank dem sicheren Linux kamen mehrere Fehlermeldungen mangels Berechtigung woanders Ordner und Files zu schreiben.

                                                                                        z.b. so

                                                                                        copy("KDB-Data/KDB-A.csv","KDB-Backup/Kopie-KDB-A$fmt_date.csv") or die "Copy failed: $!";

                                                                                          
                                                                                        Das hat mich inspiriert zu:  
                                                                                        \-------------------------------------------------------------------  
                                                                                        copy("KDB-Data/KDB-A.csv","KDB-Backup/KDB-A-$day-$month-$year.csv") or die "Copy failed: $!";  
                                                                                        \-------------------------------------------------------------------  
                                                                                          
                                                                                        Allerdings frage ich mich, ob man nicht besser das Datum zu Beginn des Filenamens in einer für den Computer zählbaren Anordnung verwenden sollte. Dies würde die Auffindbarkeit bei sehr vielen Sicherheitskopien beschleunigen, wenn mann nach einem bestimmten Datum sucht. Die meisten OS Sortieren doch den Inhalt alphabetisch...  
                                                                                          
                                                                                        Gruß  
                                                                                          
                                                                                        Gary
                                                                                        
                                                                                        1. und da du sicher das CGI Modul verwendest:

                                                                                          print CGI::p($fmt_date);

                                                                                          Nein, ich verwende diese hier:

                                                                                          Doch.


                                                                                          use CGI -no_xhtml;

                                                                                          Genau hier wird das CGI Modul eingebunden. Udn somit kannst du alle Funktionen aus diesem Modul verwenden.

                                                                                          Warum bindest du sonst ein Modul mit über 200 KB Code ein, wenn du die Funktionen nicht verwendest?

                                                                                          use Date::Calc qw(Delta_Days);
                                                                                          use Date::Calc qw(Today);

                                                                                          Du weisst auch nicht, was der qw Operator macht?

                                                                                          Er erzeugt eine Liste, deshalb kannst du auch schreiben
                                                                                          use Date::Calc qw(Delta_Days Today);

                                                                                          Jetzt hast du eine Liste von Dateien mit den Namen $day, '-', $month usw. die kopiert werden sollen. Das ist Unsinn.

                                                                                          Gott sei Dank nicht. Dank dem sicheren Linux kamen mehrere Fehlermeldungen mangels Berechtigung woanders Ordner und Files zu schreiben.

                                                                                          Naja, es bleibt trotzdem Unsinn.

                                                                                          Allerdings frage ich mich, ob man nicht besser das Datum zu Beginn des Filenamens in einer für den Computer zählbaren Anordnung verwenden sollte. Dies würde die Auffindbarkeit bei sehr vielen Sicherheitskopien beschleunigen, wenn mann nach einem bestimmten Datum sucht. Die meisten OS Sortieren doch den Inhalt alphabetisch...

                                                                                          Genau so würde ich es auch machen, ich benenne solche Dateien und Ordner immer in der Form: YYYY-MM-DD

                                                                                          Struppi.

                                                                                          1. Hi Struppi

                                                                                            Doch.

                                                                                            Du hast eindeutig  Recht! *sorry*

                                                                                            Warum bindest du sonst ein Modul mit über 200 KB Code ein, wenn du die Funktionen nicht verwendest?

                                                                                            Wahrscheinlich hab ich zu viel Speicher übrig *gröl*

                                                                                            use Date::Calc qw(Delta_Days);
                                                                                            use Date::Calc qw(Today);

                                                                                            Du weisst auch nicht, was der qw Operator macht?

                                                                                            Ich laß in der Perl Doku, daß man nicht unbedingt das ganze Date_Calc einbinden braucht, nur das was man benötigt. Das man dies auch kombiniert machen kann, wußte ich nicht. Fehlermeldung gab es zumindest aber keine - weder im Browser noch im Server-Log.

                                                                                            Er erzeugt eine Liste, deshalb kannst du auch schreiben
                                                                                            use Date::Calc qw(Delta_Days Today);

                                                                                            Gott sei Dank nicht. Dank dem sicheren Linux kamen mehrere Fehlermeldungen mangels Berechtigung woanders Ordner und Files zu schreiben.

                                                                                            Naja, es bleibt trotzdem Unsinn.

                                                                                            Auch da hast du natürlich Recht!

                                                                                            Genau so würde ich es auch machen, ich benenne solche Dateien und Ordner immer in der Form: YYYY-MM-DD

                                                                                            Danke, daß bestätigt mein Vorhaben - wird also geändert!

                                                                                            Hiermit erkläe ich den Mammut-Thread für beendet! *g*

                                                                                            Vielen Dank an alle die mitgewirkt haben.

                                                                                            Viele Grüße

                                                                                            Gary

                                                                                            PS:
                                                                                            Jetzt können höchstens noch vereinzelte Fragen zu JavaScript und Input-Überprüfung kommen. Diese aber nur spartanisch und dann im JS-Thread *lol*

                                                                              2. Hallo,

                                                                                Dein vorderer Teil (-7<= SDd) finde ich verwirrend/abstrakt. Normal kommt doch erst der Skalar, und dann der Wert des Vergleiches...

                                                                                das ist doch egal - du vergleichst zwei Werte. Ob du nun fragst, ob a<b ist, oder ob b>a ist, spielt keine Rolle; es ist dieselbe Aussage.

                                                                                Und ob "&&" (kannte ich übrigens noch nicht) besser lesbar ist als das Schlüsselwort "and" ?

                                                                                Wenn man schon mal in C programmiert hat, ja. :-)

                                                                                Ciao,
                                                                                 martin

                                                                                --
                                                                                Ordnung ist, wenn man etwas findet, was man gar nicht sucht.
                                                                                Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
                                                                  2. sudo cpan

                                                                    Terminal does not support AddHistory.
                                                                    cpan shell -- CPAN exploration and modules installation (v1.9402)
                                                                    Enter 'h' for help.

                                                                    cpan[1]> install Date::Calc

                                                                    Und als das nicht gefruchtet hat dies hier:

                                                                    Wie Matti schon sagte, das ist der Weg, du wirst im Laufe deiner Perl Entdeckungen noch viele weitere Module installieren müssen und kannst nicht immer davon ausgegehen, dass diese in der Betriebsystem Repositories zu finden sind

                                                                    Das bedeutet ich habe jetzt offiziell Date::Calc am Start.
                                                                    Problematisch dürfte es werden, wenn man diese ganzen Umgebungbedingungen auf einem anderen System zusammenbauen muss, damit die Software läuft.

                                                                    Bei größeren Progammen sind üblicherweise Installer dabei. Um sowas für dein Perlprogramm zu erstellen, gibt es auch Module. Damit kannst du solche Abhängikeiten beim installieren auflösen.

                                                                    Das war und ist halt ein riesen Vorteil von fest eingebauten Basic gewesen. Ein geschriebenes Programm konnte man überall hin mitnehmen und es war lauffähig...

                                                                    Das stimmt nur wenn du von den einfachen Basidialekten sprichst. In QuickBasic war aber z.b. auch möglich Libaries zu entwicklen, wenn diese dann fehlten lief das Programm auch nicht.

                                                                    Ausserdem schau dir mal an, wie groß dein Programm sein müßte, wenn du alles das, was die Module machen, noch zusätzlich in deinem Hauptprogramm unterbringen müßtest, wäre es es riesig. Insofern ist das kein Vorteil.

                                                                    Ausserdem scheinst du erst langsam in die Materie einzusteigen und dir ist noch nicht klar, welche Möglichkeiten du mit CPAN Modulen hast. Es sind lt. wikipedia über 20.000 Module. Es gibt kaum einen Bereich, wofür du kein Modul findest. Das ist ein Vorteil.

                                                                    Struppi.

                                                              2. Bounjoun Gary,

                                                                Und die Fehlermeldung im Browser:

                                                                Can't locate Carp/Clan.pm in @INC (@INC contains: /etc/perl /usr/local/lib/perl/5.10.0 /usr/local/share/perl/5.10.0 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 /usr/local/lib/site_perl .) at /usr/local/share/perl/5.10.0/Date/Calc/PP.pm line 18.
                                                                BEGIN failed--compilation aborted at /usr/local/share/perl/5.10.0/Date/Calc/PP.pm line 18.
                                                                Compilation failed in require at /usr/local/share/perl/5.10.0/Date/Calc.pm line 37.
                                                                BEGIN failed--compilation aborted at /usr/local/share/perl/5.10.0/Date/Calc.pm line 43.
                                                                Compilation failed in require at /usr/lib/cgi-bin/ModulTest.pl line 6.
                                                                BEGIN failed--compilation aborted at /usr/lib/cgi-bin/ModulTest.pl line 6.

                                                                Liest sich so, als verlangte die Date::Calc-Installation Abhängigkeiten. Da lobe ich mir ppm von Active State unter Windows => da werden i.d.R. alle Abhängigkeiten mitinstalliert.

                                                                Mein Modülchen mag vielleicht unterlegen sein, verlangt aber außer Time::Local (was eh Core ist), keinerlei weiteren Zeugs.

                                                                Ich geh mal eine Rauchen um wider runter zu kommen ;-)

                                                                Ich geh nicht mal, ich rauche hier ;) Und runterkommen ist gut, nur danach müßte ich die drei Sockwerke wieder hochlaufen. Dann bleibe ich lieber hier!

                                                                Adiou.

  2. Nachdem man mir nahegelegt hatte, weniger goto und mehr sub's zu nutzen
    (Was beim anderen Perlprog bereits für viel mehr übersichtlichkeit gesorgt hat - Danke!) gibt es jetzt wohl doch einschränkungen der sub's:

    Inwiefern hat deine Problem mit einer Funktion zu tun? Ich kann das nicht am Codebeispiel erkennen. Die Fehlemeldungen haben auf jeden Fall andere Ursachen.

    Bareword "LOCK_EX" not allowed while "strict subs" in use at /usr/lib/cgi-bin/Kundeneu.pl line 95.

    Dann hast du das Modulc Fcntl nicht in der datei eingebunden.

    Bareword "busy" not allowed while "strict subs" in use at /usr/lib/cgi-bin/Kundeneu.pl line 102.

    In der Zeile steht print FILEHANDLE busy - das ist wohl ein Fehler deinerseits.

    Das heisst wohl, daß ich kein File im Modus EX öffnen darf, wenn dannach ein Unterprogramm (sub) folgt?
    Das wäre ja völliger blödsinn!

    Ist es auch und zwar deine Analyse. Wie kommst auf diesen Schluss???

    Struppi.

    1. Hi Struppi

      Habe das "use Fcntl ':flock';" vergessen. Hatte gedacht ich hab es schon drin - gumpf!

      Und so:
      -----------------------------------------------
      if($Abus eq "free"){
                         print FIRSTCONTROL "busy";
                         close FIRSTCONTROL;
                         }
      -----------------------------------------------

      geht es auch... hab die Anführungszeichen vergessen.

      Wie kommst auf diesen Schluss???

      Sorry hab das "stric subs" irgendwie mit meinen sub's verwechselt *gnade*

      Danke, dann mach ich mal weiter...

      Gruß Gary

      1. hi,

        Danke, dann mach ich mal weiter...

        Klar, mach ;-)

        Schau dir mal die komfortablere Alternative zu open() an, die heißt sysopen(). Fcntl dann wie folgt:

        use Fcntl qw(:DEFAULT :flock);

        und Du kannst Modi setzen, z.B.
        sysopen(my $fh, $file, O_RDWR|O_CREAT) or return;

        Buchtipp: Perl kurz & gut, Johan Vromans (O'Reilly) das ist ein Taschenbuch, was ich schon zweimal gekauft habe, weil das wirklich hilft (und weils mir einmal geklaut wurde).

        Viele Grüße,
        Horst Hauser

        --
        Ein Esel, der sich nicht entscheiden kann, verhungert zwischen zwei Heuhaufen.
        1. Hi hotti

          Schau dir mal die komfortablere Alternative zu open() an, die heißt sysopen(). Fcntl dann wie folgt:

          use Fcntl qw(:DEFAULT :flock);

          und Du kannst Modi setzen, z.B.
          sysopen(my $fh, $file, O_RDWR|O_CREAT) or return;

          Da steht:
          ...da sysopen direkt der betriebssystemeigene Befehl zum Öffnen einer Datei benutzt. Der Vorteil besteht darin, dass Sie genauer angeben können, wie Sie die Datei öffnen wollen. Der Nachteil ist aber, dass es Probleme mit Betriebssystemen gibt, die nicht alle Features unterstützen. Das Perl-Script lässt sich dann möglicherweise nicht mehr in verschiedenen Umgebungen ausführen.

          Buchtipp: Perl kurz & gut, Johan Vromans (O'Reilly) das ist ein Taschenbuch, was ich schon zweimal gekauft habe, weil das wirklich hilft (und weils mir einmal geklaut wurde).

          Der "Wink mit dem Zaunpfahl" ist angekommen. Die Begründung für das Buch ist gut - vor allem die zweite ;-)

          Gruß Gary