Thread Vergleich Variable mit String
(22 answers)
Opened by Iggy86 at 2012-07-27 11:52
Warum benutzt du nicht meinen Code?
Dein Code hat problematische Stellen. So tut er als würde er Variablen an die Funktion übergaben, was er aber tatsächlich nicht macht. (der Pfad wird als Arbeitsverzeichnis gesetzt) Es werden globale Variable benutzt, was bei größeren Programmen zu Problemen führt. In der rekursiven Funktionen falsch eingesetzt können globale Variablen enorme Verwirrung stiften. Weiterhin wechselt der Code das Arbeitsverzeichnis, für jeden Ordner der untersucht wird. Das kostet Zeit, da jedes mal das System informiert wird. Zudem ist es hier nicht nötig. Man kann vollständige Pfade benutzen, sowohl zum Lesen des Ordnerinhalts auch auch zum lesen von Dateien. Die Funktion arbeitet Rekursiv, ruft sich also immer wider selbst auf, dabei bleiben bei jeder Rekursion alle übergeordneten Ordner geöffnet. Das belastet das System. Denn alle geöffneten Ordner werden vom System speziell verwaltet. Die zu untersuchenden Dateien werden in einem extra Durchlauf geöffnet, das ist unsinnig, da die Dateinamen im anderen Loop schon bekannt sind. Zudem ist "glob" nicht besonders schnell. Du solltest bei "open" die drei Parameter Form benutzen und lexikalische Variablen für das Filehandle. Und nun zu deinem Fehler. Mache die Überprüfung innerhalb der while-Schleife. Nochmal meinen Code angepasst: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 #!/usr/bin/perl use strict; use warnings; my $searchstring = "usr/include/malloc.h"; my $searchdir = $ARGV[0]; my $file_counter=0; my $line_counter=0; my $error=recDir($searchdir, $searchstring, \$file_counter, \$line_counter); printf ( "%04u Errors occured!\n", $error ) if($error); printf ( "searched files: %06u\n", $file_counter ); printf ( "searched lines: %06u\n", $line_counter ); ######################################################################## # Functions ############################################################ ######################################################################## sub recDir { my $path=shift(@_); my $search=shift(@_); my $filecnt=shift(@_); my $linecnt=shift(@_); my $error=0; if ( opendir (my $DIR, $path) ) { my @next_dirs; while( my $file=readdir( $DIR ) ) { # . und .. überspringen next if($file eq '.' or $file eq '..'); # neuen pfad konstruieren my $new_path="$path/$file"; # wenn Verzeichnis, # dann in die Liste und nächster Name if(-d $new_path) { push(@next_dirs, $new_path); next; } # wenn Datei und Endung ".d" if(-f $new_path and $file=~/\.d$/) { # gesamten Zähler erhöhen $$filecnt++; # Ausgabe wo man gerade ist. printf ( "\n06u.) found %s \n", $$filecnt, $new_path ); # Datei öffnen und prüfen if(open(my $fh, '<', $new_path)) { my $found=0; while( my $line=<$fh> ) { $$linecnt++; # wenn der Suchstring vorhanden, # dann dann found=1 und Suche abbrechen if( index($line,$search) != -1) { $found++; last; } } # Datei schließen close($fh); # Ausgabe des Suchergebnisses if($found) { printf ( "\nSearchstring found in %s\n", $file ); } else { printf ( "\nSearchstring not found in %s\n", $file ); } } else { warn "Can't open $new_path ($!)\n"; $error++; } } } $error += recDir($_,$search,$filecnt,$linecnt) for(@next_dirs); } else { warn "can't open Dir $path ($!)\n"; $error++; } return $error; } Ich schreibe den Code um dir zu zeigen wie es besser geht. Das hat nur wenig mit meinen persönlichen Vorlieben zu tun. Der Code umgeht Konkrete Fehler, die ich mal gemacht habe. Er soll dir Hilfestellung geben wie man es besser machen kann. Vollständig ignoriert zu werden ist nicht besonders schön. EDIT: Tippfehler im Code beseitigt. Last edited: 2012-07-27 16:54:34 +0200 (CEST) |