Bernhard Peissl: RegExpr. zum durchsuchen von beliebig vielen Unterverzeichnissen

Hallo und so,

Ich habe mir ein kleine PERLchen geschrieben, mit dem ich meine HTML-Dateien nach Fehlern "parse" (Umlaute in Entities umwandeln und ähnliche Kinkerlitzchen). Das funktioniert wunderbar, wenn ich im aktuellen Verzeichnis bleiben will. Aber wenn ich auch die Unterverzeichnisse nach *.html absuchen will, was mache ich da ?

Ich bin leider nicht so der Fan von regulären Ausdrücken -Krieg da nie was zustande! Wäre dankbar, wenn ihr mir sagen könntet, wie das geht. Ihr habt doch sicher auch alle schon mal sowas gemacht ;-)

// while($filename = glob("*.html") $filename = glob("*.htm")) {
//   @lines=();
//   open (FILE, $filename) die "Can't open $filename: $!";
//   while ($line = <FILE>) {
//      chomp ($line);
//      parseString();
//      push (@lines,$line);
//   }
//   close (FILE) die "Can't close $filename: $!";
//
//   $filename = ">".$filename;
//
//   open (FILE, $filename) die "Can't open $filename: $!";
//     foreach $_ (@lines) {
//    print FILE $_."\n";
//  }
//   close (FILE) die "Can't close $filename: $!";
// }

Danke,
Bernhard

  1. Hi,

    Aber wenn ich auch die Unterverzeichnisse nach *.html absuchen will, was mache ich da ?

    perldoc File::Find

    Und vergiß glob()...

    Cheatah

    1. Hallo cheatah!

      Das schreibts sich leicht:

      perldoc File::Find

      Puuhhhh !!!

      // find2perl / -name .nfs\* -mtime +7 \ -exec rm -f {} ; -o -fstype nfs -prune

      oder

      // sub wanted {
      //         /^.nfs.*\z/s &&
      //         (($dev, $ino, $mode, $nlink, $uid, $gid) = lstat($_)) &&
      //         int(-M _) > 7 &&
      //         unlink($_)
      //        
      //         ($nlink (($dev, $ino, $mode, $nlink, $uid, $gid) = lstat($_))) &&
      //         $dev < 0 &&
      //         ($File::Find::prune = 1);
      //     }

      ... Die Hieroglyphen aus dem alten Ägypten sind ja harmlos gegen das !!!!!!!

      Ich habs mir - grosses Indianerehrenwort - durchgelesen (ca. 4 mal), und habe exakt nix kapiert :-( Die ganzen foo's und wanted's haben mich ganz hirndallig gemacht !!

      Ich muss gestehen, das ist das erste Mal, dass ich ein Modul einbinden will. Schelte mich nicht für diese Frage, aber muss man es extra einbinden? Ich hab gesehen, glob() gehört auch zum Modul "File". Wenn das dasselbe glob ist, welches ich in meinem PERLchen verwende müsste find() ja auch mit use CGI; eingebunden sein ??

      Aber wichtiger:

      • Was muss in der wanted() Funktion drinnenstehen ?? Da kann ich
          mir überhaupt keinen Reim drauf machen :-( Ist das meine
          parseString() - Funktion ?? Oder ist es das "Suchmuster" (*.html).
          Vorschlag: sub wanted() { /*.html/ && /*.htm/; } ??????
      • Wie kriege ich die Unterverzeichnisse rein ? - heisst follow=1, er
          geht jedem (?symbolischen?) Link d.h. jedem(!) Unterverzeichnis
          nach ?
      • Wie sieht die find() Funktion dann schiesslich aus ?
          Vorschlag: find(/*.html/,follow=1); # ob das mal stimmt ? ;-(
      • Wie krieg ich das dann in meine while-Schleife?
          Vorschlag: while ($filename = find(wanted(),follow=1)) {...}
          ... und dann weiter wie gewohnt (open FILE .. close FILE) ????

      Und dann kommen da auch noch Refernzen vor, da krieg ich ohnehin immer sehr leicht ne Krise!!

      // use File::Find;
      // find({ wanted => &process, follow => 1 }, '.');

      Was sind denn bitte Code References ?

      Lass mich jetzt bitte nicht im Regen stehen!

      Und vergiß glob()...

      gern !

      Grüsse
      Bernhard

      1. Hallo Bernhard,

        Hallo cheatah!

        Das schreibts sich leicht:

        perldoc File::Find

        Puuhhhh !!!

        Vergiss Perldoc (in diesem Fall) ;)

        ... Die Hieroglyphen aus dem alten Ägypten sind ja harmlos gegen das !!!!!!!

        Geht mir genauso. Da mich der Fall auch interessiert, habe ich mal mein Perl Cookbook rausgeholt. Ein seehr empfehlenswertes Buch!

        Da gibt es das Kapitel 9.7. "Processing All Files in a Directory Recursively". Also, des isses doch.

        Da steht, dass du File::Find im wesentlichen so verwenden sollst:

        #!/usr/bin/perl -w

        use File::Find;
        @ARGV = ('.') unless @ARGV; # Default ist die Suche vom relativen Verzeichnis

        process_function: Funktion, die was mit dem aktuellen File macht

        find(&process_function,@ARGV);

        sub process_function  {

        Dir stehen die folgenden Variablen zur Verfuegung:

        $File::Find::dir  ist das Verzeichnis relativ zum Startpfad

        $File::Find::name  Name des aktuellen Files mit Pfadangabe

        $_  Name des aktuellen Files ohne Pfadangabe

        }

        Konkret hier noch ein Skript, das alle *.htm(l) Dateien in einem Verzeichnis und allen Unterverzeichnissen ausgibt:

        #!/usr/bin/perl -w

        use File::Find;
        @ARGV = ('.') unless @ARGV;
        my @html_file_list;
        my $n_html_files = 0;

        find(&html_files,@ARGV);

        print "$n_html_files HTML files in @ARGV : @html_file_list\n";

        sub html_files  {
          my $file = $_;
          return unless -f && ( $file =~/.html?$/ );

        push(@html_file_list, $File::Find::name);
          ++ $n_html_files;

        }

        Du musst also eigentlich nur statt den letzten zwei Zeilen eine weitere Funktion einsetzen, die die Datei list, die Umlaute etc. bearbeitet und die Datei zurueckschreibt.

        Viele Gruesse aus Starnberg

        Johannes Eble

        1. Hallo Johannes!

          Konkret hier noch ein Skript, das alle *.htm(l) Dateien in einem Verzeichnis und allen Unterverzeichnissen ausgibt:

          Das ist echt nett von dir, aber ich fürchte das ist nicht weniger altägyptisch für mich wie das perldoc. Obwohl ich gestehen muss, ein bissi mehr kann ich mir jetzt schon vorstellen!

          Ein Versuch:

          #!/usr/bin/perl -w

          use File::Find;
          @ARGV = ('.') unless @ARGV; # Default ist die Suche vom relativen Verzeichnis

          Was ist ein relatives Verzeichnis ? Heisst das, wenn ich z.B.: @ARGV = ('dir1'); sage, dann sucht er im Verzeichnis dir1 weiter ???

          my @html_file_list;
          my $n_html_files = 0;

          find(&html_files,@ARGV);

          print "$n_html_files HTML files in @ARGV : @html_file_list\n";

          sub html_files  {
            my $file = $_;
            return unless -f && ( $file =~/.html?$/ );

          .... kommt hier meine While Schleife rein ???

          //     $filename=$File::Find::name;
          //     while (defined($filename)){ # brauch ich die überhaupt, oder wird die Funktion ohnehin für
                                             #jedes file extra aufgerufen (ich habe bei dir auch keine Schleife entdeckt ?)
          //        open (FILE,$filename) ;
          //        while ($line = <FILE>) { chomp($line); parseString(); ... }
          //        close (FILE);
          //     }

          ... und dann wieder hineinscreiben !

          push(@html_file_list, $File::Find::name);
            ++ $n_html_files;

          »»  }

          Stimmt das rein theoretisch so ?????

          Ich habe dein Script ausprobiert, und es läuft. Ich frag besser gar nicht, was die Process Function macht. Man kann ja nicht alles wissen ;-(

          Danke für den Code,
          Bernhard

          1. Morjen Bernhard,

            Was ist ein relatives Verzeichnis ? Heisst das, wenn ich z.B.: @ARGV = ('dir1'); sage, dann sucht er im Verzeichnis dir1 weiter ???

            Der Punkt (.) ist das relative Verzeichnis, also das Verzeichnis, in dem du dich gerade befindest. Mit @ARGV kannst du Kommandozeilenparameter aufrufen, d.h. wenn dein Perl-Skript htmlsuche.pl heisst, kannst du es mit perl htmlsuche.pl /ein_dir/ein_unter_dir/html/ usw. eingeben, oder, wie du wohl meinst, perl htmlsuche.pl c:/dir1/, wenn du alle Verzeichnisse (in Windows) ab c:\dir1 durchsuchen willst. Die Zeile
            @ARGV = ('.') unless @ARGV;    
            heisst auf gut deutsch, dass, wenn du keine Kommandozeilenparameter eingibtst, also perl htmlsuche.pl, automatisch der Punkt, das relative Verzeichnis, die Suche automatisch mit dem aktuellen Verzeichnis begonnen wird.

            sub html_files  {
              my $file = $_;
              return unless -f && ( $file =~/.html?$/ );

            Will heissen: Nur dann in der Funktion weitermachen, wenn das aktuelle File, das gerade gescannt wird, wirlich ein File (-f) ist und auf htm oder html endet.

            .... kommt hier meine While Schleife rein ???

            Nein, denn jetzt hast du ja schon einen Algorithmus, der dir rekursiv die Directories durchsucht, das macht ja find, darum brauchst du dich nicht mehr zu kuemmern.

            //     $filename=$File::Find::name;
            //     while (defined($filename)){ # brauch ich die überhaupt, oder wird die Funktion ohnehin für
                                               #jedes file extra aufgerufen (ich habe bei dir auch keine Schleife entdeckt ?)

            Siehe oben. Die obigen Zeilen weglassen. Ist in find. Magic ;)

            //        open (FILE,$filename) ;

            Das ist richtig. Wenn du meinen Programmteil verwenden willst, heisst es aber
                       open (FILE,$file);

            //        while ($line = <FILE>) { chomp($line); parseString(); ... }
            //        close (FILE);
            //     }

            ... und dann wieder hineinscreiben !

            Ja. Packe das aber am besten in Funktionen, sonst wird es unuebersichtlich. Eben Perl ;)

            Ich habe dein Script ausprobiert, und es läuft. Ich frag besser gar nicht, was die Process Function macht. Man kann ja nicht alles wissen ;-

            Doch, frag ruhig. Es geht ja darum, dass du das wesentliche begreifst und nicht einfach Code uebernimmst:

            sub html_files  {
              my $file = $_; # Aktuelles File in $file speichern. $_ wurde von find auf das aktuelle File gesetzt (magic).
              return unless -f && ( $file =~/.html?$/ ); # (s.o)

            push(@html_file_list, $File::Find::name); # Wenn das aktuelle File auf htm oder html endet, speichere den Namen in der Liste @html_file_list (,ansonsten kommt das Programm ja garnicht bis zu dieser Zeile, weil es mit der vorigen return Anweisung aus der Unterfunktion "rausgeworfen" wurde).
              ++ $n_html_files; # Erhoehe die Anzahl der html-files um eins

            }

            Johannes

            1. Hallo Johannes,

              Schön langsam wird's. Dank eurer Erklärungen! -

              Was ist ein relatives Verzeichnis ? Heisst das, wenn ich z.B.:
              @ARGV = ('dir1'); sage, dann sucht er im Verzeichnis dir1
              weiter ???
              Der Punkt (.) ist das relative Verzeichnis, also das Verzeichnis,
              in dem du dich gerade befindest.

              ... So werden Vermutungen wahr ;-)

              Mit @ARGV kannst du Kommandozeilenparameter aufrufen, d.h. wenn
              dein Perl-Skript htmlsuche.pl heisst, kannst du es mit perl
              htmlsuche.pl /ein_dir/ein_unter_dir/html/ usw. eingeben, oder,
              wie du wohl meinst, perl htmlsuche.pl c:/dir1/, wenn du alle
              Verzeichnisse (in Windows) ab c:\dir1 durchsuchen willst.

              Da hab ich wieder was gelernt! Das heisst dann, dass es bei jedem
              PERL-Programm ein @ARGV gibt ? z.B.: "perl irgendwas.pl argument1
              argument2" Ist dann $ARGV[0]==argument1 und $ARGV[1]==argument2 ?

              Und @ARGV = ("defaultArgument") unless @ARGV;
              ... wäre dann gelichbedeutend mit:
              if (!@ARGV) push (@ARGV, "defaultArgument");

              @ARGV = ('.') unless @ARGV;    
              heisst auf gut deutsch, dass, wenn du keine
              Kommandozeilenparameter eingibtst, also perl htmlsuche.pl,
              automatisch der Punkt, das relative Verzeichnis, die Suche
              automatisch mit dem aktuellen Verzeichnis begonnen wird.

              So einfach wärs gewesen ;-) Aber das war alles zu verwirrend, als
              dass ich selbst draufgekommen wäre!

              sub html_files  {
                my $file = $_;
                return unless -f && ( $file =~/.html?$/ );
              Will heissen: Nur dann in der Funktion weitermachen, wenn das
              aktuelle File, das gerade gescannt wird, wirlich ein File (-f)
              ist und auf htm oder html endet.

              Dieses Un-less, ein Un-ding !!!! Sollte man verbieten ;-)

              Doch, frag ruhig. Es geht ja darum, dass du das wesentliche
              begreifst und nicht einfach Code uebernimmst:

              Das ist es ja, ich will ja was lernen dabei, aber ich fürchte, dass
              ich euch mit meiner Fragerei bald auf die Nerven gehen werde.
              Hoffentlich bin ich auch bald so gscheit wie ihr, dann kann ich
              meine Schuld bei euch begleichen ;-)
              Aber manchmal hab ja auch ich schon jemandem hier helfen können :-))

              Auf den ersten Blick schreckt mich ja bloss immer die verkorkste
              Syntax von PERL. Wenns mir dann jemand erklärt, kapiere ich es ja eh
              flott, aber es braucht halt immer irgendwen ;-(

              Danke also, und
              Schöne Grüsse,
              Bernhard

              1. Hallo Bernhard,

                Hallo Johannes,

                Schön langsam wird's. Dank eurer Erklärungen! -

                freut mich, wenn ich dir helfen konnte. Ich bin naemlich leider meist auf der Fragerseite.

                Da hab ich wieder was gelernt! Das heisst dann, dass es bei jedem
                PERL-Programm ein @ARGV gibt ? z.B.: "perl irgendwas.pl argument1
                argument2" Ist dann $ARGV[0]==argument1 und $ARGV[1]==argument2 ?

                Ja.

                Und @ARGV = ("defaultArgument") unless @ARGV;
                ... wäre dann gelichbedeutend mit:
                if (!@ARGV) push (@ARGV, "defaultArgument");

                So aehnlich.

                Dieses Un-less, ein Un-ding !!!! Sollte man verbieten ;-)

                Noe, find ich nicht. Unless=Wenn nicht. if(!..) sollte man verbieten ;)

                ich euch mit meiner Fragerei bald auf die Nerven gehen werde.

                Mir gehst du noch nicht auf die Nerven. Und Cheatah scheint so gerne "perldoc" schreiben zu wollen. Lass' ihn doch. ;)

                Hoffentlich bin ich auch bald so gscheit wie ihr, dann kann ich...

                Ich bin wirklich auch blutiger Anfaenger, aber das Cookbook macht wohl gscheit.

                Auf den ersten Blick schreckt mich ja bloss immer die verkorkste
                Syntax von PERL. Wenns mir dann jemand erklärt,

                Weiss auch nicht, warum die so kryptisch sein muss. Aber wer mit Unix, grep & Co aufgewachsen ist, wird wohl so ...?

                Mir scheint Python (hab nur mal reingeschnuppert) da viel zugaenglicher, ist aber Geschmacksache.

                1. Hi,

                  Und Cheatah scheint so gerne "perldoc" schreiben zu wollen. Lass' ihn doch. ;)

                  jepp, ich liebe es :-)

                  Ernsthaft:
                  Ich halte es allgemein für sinnvoller, jemandem zu sagen, wie er selbst zur Lösung findet, anstatt sie ihm fix und fertig, vorgekocht, garniert, geschnitten (und ggf. auch vorgekaut) zu servieren. Es dauert dann zwar länger, bis er die Lösung hat, aber dafür hat er spätestens beim übernächsten Problem ein Erfolgserlebnis, weil er nicht mehr nachfragen muß. Darum gibt's von mir viel RTFM und wenig Code... :-)

                  Cheatah

                  1. Hallo Cheatah,

                    Hi,

                    Und Cheatah scheint so gerne "perldoc" schreiben zu wollen. Lass' ihn doch. ;)

                    jepp, ich liebe es :-)

                    Ernsthaft:
                    Ich halte es allgemein für sinnvoller, jemandem zu sagen, wie er selbst zur Lösung findet, anstatt sie ihm fix und fertig, vorgekocht, garniert, geschnitten (und ggf. auch vorgekaut) zu servieren. Es dauert dann zwar länger, bis er die Lösung hat, aber dafür hat er spätestens beim übernächsten Problem ein Erfolgserlebnis, weil er nicht mehr nachfragen muß. Darum gibt's von mir viel RTFM und wenig Code... :-)

                    Du hast eingentlich schon recht und ich habe echt Ehrfurcht vor deiner Perl-Kompetenz, aber in diesem Fall muss ich schon sagen. Die Perldoc ist hier eher zum Abgewoehnen. Unmoeglich fuer einen Anfaenger, das zu verstehen. Immerhin war die Perldoc der richtige Hinweis, auch fuer mich ;)

                    Johannes

                    Cheatah

      2. Hi,

        // sub wanted {

        diese ist für Dich eigentlich interessant, auch wenn der Inhalt Dir wenig bringt.

        ... Die Hieroglyphen aus dem alten Ägypten sind ja harmlos gegen das !!!!!!!

        Perl wurde von einem Linguistiker entwickelt ;-)

        Ich habs mir - grosses Indianerehrenwort - durchgelesen (ca. 4 mal), und habe exakt nix kapiert :-( Die ganzen foo's und wanted's haben mich ganz hirndallig gemacht !!

        wanted ist die Funktion, die in den Beispielen für jede einzelne gefundene Datei aufgerufen wird - also Deine parseString.

        Schelte mich nicht für diese Frage, aber muss man es extra einbinden?

        Ja. Die Zeile

        use File::Find;

        ist aber nicht sooo aufwendig ;-)

        Ich hab gesehen, glob() gehört auch zum Modul "File".

        Nein, glob gehört zum Perl-Core.

        Wenn das dasselbe glob ist, welches ich in meinem PERLchen verwende müsste find() ja auch mit use CGI; eingebunden sein ??

        Nein, die Funktion wird nur in File::Find definiert.

        Kleiner Tip: Schau Dir mal Deine %PERL%\site\lib\CGI.pm und %PERL%\site\lib\File\Find.pm (o.ä.) an. Vielleicht geht Dir ja das eine oder andere Licht auf :-)

        • Was muss in der wanted() Funktion drinnenstehen ?? Da kann ich
            mir überhaupt keinen Reim drauf machen :-( Ist das meine
            parseString() - Funktion ??

        Siehe oben :-)

        Oder ist es das "Suchmuster" (*.html).

        Das mußt Du dort drin angeben, z.B. über eine RegExp. wanted wird für _jede_ Datei aufgerufen, also mußt Du dort auswählen.

        Vorschlag: sub wanted() { /*.html/ && /*.htm/; } ??????

        Perl-Magie, aber falsch :-)

        /.htm(l)?$/i && Anweisung; # prüft, ob $_ auf die genannte RegExp matched und führt in dem Fall 'Anweisung' aus. Gleichwertig zu

        if ($_ =~ /.htm(l)?$/i) { Anweisung; }

        TIMTOWTDI - There Is More Than One Way To Do It!

        • Wie kriege ich die Unterverzeichnisse rein ?

        Gar nicht, das macht das Modul eh schon.

        • heisst follow=1, er
            geht jedem (?symbolischen?) Link d.h. jedem(!) Unterverzeichnis
            nach ?

        Finde ich in meiner Doku nicht. Aber ein symbolischer Link ist kein Unterverzeichnis.

        • Wie sieht die find() Funktion dann schiesslich aus ?

        find(&parseString, '/path/to/dir');

        Vorschlag: find(/*.html/,follow=1); # ob das mal stimmt ? ;-(

        Nö :-)

        • Wie krieg ich das dann in meine while-Schleife?

        Gar nicht, das macht File::Find für Dich.

        Vorschlag: while ($filename = find(wanted(),follow=1)) {...}

        Wieder nicht :-)

        ... und dann weiter wie gewohnt (open FILE .. close FILE) ????

        Das schon. Die Dateien mußt Du schon selbst bearbeiten, das Modul liefert Dir nur den Namen.

        Und dann kommen da auch noch Refernzen vor, da krieg ich ohnehin immer sehr leicht ne Krise!!

        Ist hier ganz einfach. Nur den Backslash vor den Funktionsnamen setzen (s.o.), dann paßt das schon.

        // use File::Find;
        // find({ wanted => &process, follow => 1 }, '.');

        Wo hast Du das denn schon wieder her? Ich glaube, ich habe hier eine andere Version des Moduls als Du :-)

        Was sind denn bitte Code References ?

        Eine Referenz auf den Code. Logisch :-)

        Lass mich jetzt bitte nicht im Regen stehen!

        Ich würd mal sagen: Just do it! Laß Dir erst mal in Deiner &parseString einfach nur die Dateinamen und -verzeichnisse ausgeben, dann siehst Du vielleicht klarer, wie das alles vor sich geht. Danach geht's normal mit open und close weiter.

        Cheatah

        1. Hi cheatah

          Ich glaub, ich habs jetzt, ein paar Fragen sind noch offen, aber im Grossen und Ganzen bin ich glaub ich dahintergestiegen :-))))

          ... Die Hieroglyphen aus dem alten Ägypten sind ja harmlos gegen das !!!!!!!
          Perl wurde von einem Linguistiker entwickelt ;-)

          Ich weiss ;-(

          wanted ist die Funktion, die in den Beispielen für jede einzelne
          gefundene Datei aufgerufen wird - also Deine parseString.

          Das war mir bis dato unklar, aber du hast Licht in die Sache gebracht :-)

          Schelte mich nicht für diese Frage, aber muss man es extra einbinden?
          Ja. Die Zeile: use File::Find;
          ist aber nicht sooo aufwendig ;-)

          ... Hast ja recht ;-)

          Kleiner Tip: Schau Dir mal Deine %PERL%\site\lib\CGI.pm und
          %PERL%\site\lib\File\Find.pm (o.ä.) an. Vielleicht geht Dir ja
          das eine oder andere Licht auf :-)

          Hab kurz nen Blick rein geworfen. Ich sag nur:

          // $abs_name=~ s/(?>[^/]+)/..//);

          :-(

          /.htm(l)?$/i && Anweisung; # prüft, ob $_ auf die genannte
          RegExp matched und führt in dem Fall 'Anweisung' aus.
          Gleichwertig zu:
          if ($_ =~ /.htm(l)?$/i) { Anweisung; }

          Das war die Meldung, die den Tag gerettet hat, die hat Licht in die Sache gebracht :-)

          Aber was macht das ?$ hinter dem htm(l) ?

          TIMTOWTDI - There Is More Than One Way To Do It!

          Genau das ist mein Problem mit PERL. Das ist als ob man im grössten Supermarkt der Welt steht, und vor lauter Angeboten erst nicht weiss was man kaufen soll.  
          Die Auswahlmöglichkeiten erschlagen einen in ihrer Vielfalt und Reichhaltigkeit. -Schön gesagt, oder ;-)

          Ich habs lieber klar strukturiert und weniger chaotisch. Da kann man sich ja schon morgen nicht mehr erinnern, was man gestern programmiert hat. Ich weiss nicht, ob ich in einer Woche noch weiss, wie man Unterverzeichnisse absucht, aber ich hoffe es freilich trotzdem ;-) jetzt wo ihr euch so anstrengt, es mir beizubringen!

          • Wie kriege ich die Unterverzeichnisse rein ?
            Gar nicht, das macht das Modul eh schon.

          Wieder ein Aha-Moment :-)

          • Wie sieht die find() Funktion dann schiesslich aus ?
            find(&parseString, '/path/to/dir');

          /path/to/which/dir/ ? Habs probiert, hab die Datei in den CGI-Bin gelegt, und wollte find(&parseString, '../htdocs/') aufrufen!
          ... Fehlanzeige!

          Wieder nicht :-)

          Ich stell mir das irre lustig vor für dich, ich weiss ja überhaupt nix ;-(

          Vorschlag 1 => falsch!
          Vorschlag 2 => nönö!
          Vorschlag 3 => wieder nix!
          Vorschlag 4 => auch daneben!

          ... und dann weiter wie gewohnt (open FILE .. close FILE) ????
          Das schon.

          Juhuuuu!!! Endlich mal richtig getippt ;-)

          Und dann kommen da auch noch Refernzen vor, da krieg ich
          ohnehin immer sehr leicht ne Krise!!
          Ist hier ganz einfach. Nur den Backslash vor den Funktionsnamen
          setzen (s.o.), dann paßt das schon.

          Na so einfach lass ich mich nicht abspeisen ;-)
          Kann man die mit c/c++ Referenzen/Zeiger vergleichen. Kann man z.B. eine Funktion mit einer Referenz auf eine Variable als Parameter aufrufen, die dann direkt auf der Variablen, auf die die Referenz zeigt, arbeitet.

          z.B. primitiv ausgedrückt:

          [...]
          irgendwas(&variable); # Funktionsaufruf
          [...]

          sub irgendwas(what_i_got) {what_i_got++;} # Funktionsdefinition

          ... und dann ist der Wert $variable um eins höher

          lass mich raten: wieder nix ??

          Was sind denn bitte Code References ?
          Eine Referenz auf den Code. Logisch :-)

          Für jemanden der Englisch kann ja ;-)
          aber für jemanden der PERL lernen will (?) ein Rätsel

          Ich würd mal sagen: Just do it! Laß Dir erst mal in Deiner
          &parseString einfach nur die Dateinamen und -verzeichnisse
          ausgeben, dann siehst Du vielleicht klarer, wie das alles vor
          sich geht. Danach geht's normal mit open und close weiter.

          Ich habs gleich mit "open und close weiter probiert", und dann die Dateinamen und -Verzeichnisse ausgeben lassen. Nur die Harten kommen durch ;-)

          Jedenfalls recht herzlichen Dank, hast mir wiedermal viel Neues gelernt!

          Schöne Grüsse,
          Bernhard

          1. Hi,

            Perl wurde von einem Linguistiker entwickelt ;-)

            Ich weiss ;-(

            man gewöhnt sich dran ;-)

            // $abs_name=~ s/(?>[^/]+)/..//);

            :-(

            Was ist daran schlimm? Abgesehen davon, daß eine Klammer zu viel geschlossen wird, natürlich.

            if ($_ =~ /.htm(l)?$/i) { Anweisung; }

            Das war die Meldung, die den Tag gerettet hat, die hat Licht in die Sache gebracht :-)

            Aber was macht das ?$ hinter dem htm(l) ?

            RTF perldoc perlre ;-)

            Das Fragezeichen sagt, daß der vorhergegangene Teil "(l)" ein oder kein Mal vorkommen darf, das Dollarzeichen markiert das Stringende.

            TIMTOWTDI - There Is More Than One Way To Do It!

            Genau das ist mein Problem mit PERL.

            Lern einfach zu sprechen ;-)

            Das ist als ob man im grössten Supermarkt der Welt steht, und vor lauter Angeboten erst nicht weiss was man kaufen soll.

            Und trotzdem schafft man's irgendwie, oder?

            find(&parseString, '/path/to/dir');

            /path/to/which/dir/ ? Habs probiert, hab die Datei in den CGI-Bin gelegt, und wollte find(&parseString, '../htdocs/') aufrufen!

            Im CGI-Kontext weißt Du _nie_, welches gerade das aktuelle Verzeichnis ist. Schreib einen absoluten Serverpfad, statt einem relativen mit '../'.

            Wieder nicht :-)

            Ich stell mir das irre lustig vor für dich, ich weiss ja überhaupt nix ;-(

            *g* :-)

            Vorschlag 1 => falsch!
            Vorschlag 2 => nönö!
            Vorschlag 3 => wieder nix!
            Vorschlag 4 => auch daneben!

            Naja, solange ich noch dazu sage, was richtig ist... :-)

            Kann man die mit c/c++ Referenzen/Zeiger vergleichen.

            Keine Ahnung, ich kenne C/C++ nicht näher.

            Kann man z.B. eine Funktion mit einer Referenz auf eine Variable als Parameter aufrufen, die dann direkt auf der Variablen, auf die die Referenz zeigt, arbeitet.

            Jo. Siehe

            perldoc perlref
            perldoc perlreftut

            Cheatah

            1. Hi cheatah!

              Perl wurde von einem Linguistiker entwickelt ;-)
              Ich weiss ;-(
              man gewöhnt sich dran ;-)

              Manche, manche aber nie ;-)

              // $abs_name=~ s/(?>[^/]+)/..//);
              :-(
              Was ist daran schlimm? Abgesehen davon, daß eine Klammer zu viel
              geschlossen wird, natürlich.

              Ja natürlich, entschuldige bitte, da hab ich mich doch glatt
              vertippt, wie konnte das bloss passieren ;-)

              if ($_ =~ /.htm(l)?$/i) { Anweisung; }
              Aber was macht das ?$ hinter dem htm(l) ?
              Das Fragezeichen sagt, daß der vorhergegangene Teil "(l)" ein
              oder kein Mal vorkommen darf, das Dollarzeichen markiert das
              Stringende.

              Hab ich mir noriert !!

              TIMTOWTDI - There Is More Than One Way To Do It!
              Genau das ist mein Problem mit PERL.
              Lern einfach zu sprechen ;-)

              Das ist als ob man im grössten Supermarkt der Welt steht, und
              vor lauter Angeboten erst nicht weiss was man kaufen soll.  
              Und trotzdem schafft man's irgendwie, oder?

              Aber die köstlichsten Schokoriegel findet man nie (frei nach Kafka) ;-)

              /path/to/which/dir/ ? Habs probiert, hab die Datei in den CGI-
              Bin gelegt, und wollte find(&parseString, '../htdocs/')
              aufrufen!
              Im CGI-Kontext weißt Du _nie_, welches gerade das aktuelle
              Verzeichnis ist. Schreib einen absoluten Serverpfad, statt einem
              relativen mit '../'.

              Stimmt, da hab ich was geschrieben ohne nachzudenken, das selbe
              Problem hatte ich schonmal mit einer JS-Datei, die in eine dynamisch
              erzeugt Seite "eingelinkt" werden sollte. Die hat er auch nie
              gefunden ("Ressource not found" -Mein zweit-Lieblingsfehler)

              Somit wäre dann '/gifs/' der absolute Pfad mit dem ich alle gifs in
              diesem und seinen Unterverzeichnissen aufspüren könnte, also
              ausgehend vom root-dir meiner homepage (www.irgendwo.com/gifs/) -Ich
              mach zwar Homepages für andere, aber selbst hab ich noch immer keine
              eigene ;-).

              Naja, solange ich noch dazu sage, was richtig ist... :-)

              Genau das ist es, was dieses Forum auszeichnet :-)

              Kann man die mit c/c++ Referenzen/Zeiger vergleichen.
              Keine Ahnung, ich kenne C/C++ nicht näher.

              Oje, schlecht für dich, denn da gehts ordentlich zu, da gibts Regeln, und man weiss leichter was man falsch gemacht hat (im Gegensatz zu <emotion class="ärgern">Javascript</emotion>)

              keep it simple ;-)
              Bernhard

              1. Hi,

                Im CGI-Kontext weißt Du _nie_, welches gerade das aktuelle
                Verzeichnis ist. Schreib einen absoluten Serverpfad, statt einem
                relativen mit '../'.

                Somit wäre dann '/gifs/' der absolute Pfad mit dem ich alle gifs in
                diesem und seinen Unterverzeichnissen aufspüren könnte,

                nicht im Script, das arbeitet nämlich auf Basis des Filesystems. Frage am besten Deinen Provider, wie der Pfad zum Serverroot lautet, und orientiere Dich dann daran.

                Vermutlich heißt es irgendwie '/www/deinName/htdocs/gifs' oder so.

                Cheatah