Veröffentlicht 8. Juli 200817 j Hi ich bin ziehmlich neu in dem Thema Perl brauche mal eure hilfe. ich will ein verzeichnis öffnen und dort dann die ersten 5 stellen des dateinamens rausfiltern. Dann soll im Anschluss gecheckt werden ob es noch eine 2. Datei in dem Ordner gibt,die die selbe 5 stellige ID hat und dann natürlich ausgeben. also ich bin jetzt soweit: #!/usr/bin/perl -w $ordner="/var/tmp/test"; opendir(DIR, $ordner ); @files = readdir(DIR); closedir(DIR); foreach (@files){ $vierzeichen=substr($_,0,5); print $vierzeichen; } Er gibt jetzt zwar alle dateinamen wieder ( auch nur die ersten 5 stellen der datei ) aber er prüft noch nicht ob es doppelte gibt. könnt ihr mir da helfen ? ich hab da so ein ansatz gesehen aber ich denk da bin ich vollkommen falsch ( eq ) foreach (@files){ $vierzeichen=substr($_,0,5); push (@doppelt,$_) if (substr($_,0,5) eq $vierzeichen); print @doppelt; } Bearbeitet 8. Juli 200817 j von Hyäne
8. Juli 200817 j ich bin jetzt nicht der perlcrack, aber ich denke die methodik mittels push könnte funktionieren. allerdings wird hier zuerst gepusht und anschliessend geprüft, ob dein subtring übereinstimmt. was passiert denn, wenn du den ansatz mittels push umsetzt? s'Amstel
8. Juli 200817 j da gibt er alle dateien aus.....ist ja irgendwie auch logisch weil er schaut ja einfach nur ob es nach dem muster eine datei gibt und JA es gibt ja eine...
8. Juli 200817 j Hi, damit löscht du alle doppelten Einträge aus dem Array @files und weist sie @files_new zu. Ungetestet! sub del_double { my %all; $all{$_}=0 for @_; return (keys %all); } my @files_new=&del_double(@files); Ob du vorher noch @files so modifizierst, dass nur die ersten 5 Stellen berücksichtig werden, kannst ja selber entscheiden. ciao, vic
9. Juli 200817 j diese methode hatte ich auch schon gefunden aber der vergleicht da ja nur wieder den Hash-Wert. Er soll ja nach der Dateibezeichnung schauen und dann die doppelten ausspucken.
9. Juli 200817 j Dann lässt danach noch ... @union = @isect = @diff = (); %count = (); foreach $e (@files, @files_new) { $count{$e}++ } foreach $e (keys %count) { push(@union, $e); if ($count{$e} == 2) { push @isect, $e; } else { push @diff, $e; } } ... laufen. Somit hast alles mögliche in verschiedenen Arrays. Oder hast du ein Problem damit, in @files die Dateinamen zu modifizieren? ciao, vic
9. Juli 200817 j so da ich der absolute noob in perl bin hab ich den überblick verloren kannste mir mal den die einzelnen elemente erläutern ? da sind jetzt soviele variablen... in welcher variablen werden jetzt z.b. die doppelten gespeichert? also welche muss ich mir anschauen ? kannst du evtl. auch noch einmal den kompletten quellcode jetzt zusammen schnippseln ? danke
15. Juli 200817 j Hi, post doch nochmal deinen Quelltext, denn du bisher hast (inkl. den eingebauten Hinweisen) und welche Probleme du damit hast bzw. was du nicht verstehst. ciao, vic
15. Juli 200817 j Ist nun kein Perl also gehört nur bedingt hier hin aber in der Shell würde es mit ls | cut -c1-5 |uniq -D gehen.
17. Juli 200817 j hatte auch schon überlegt mit shell zu arbeiten aber ich wollte mich ja eigentlich mit perl ein wenig für die zukunft beschäftigen naja wie gesagt ich hab überhaupt noch nicht den durchblick wegen den ganzen varialben und funktionen....perl hebt sich doch ein wenig von anderen sprachen ab wie ich finde.... das hab ich bisher ja gehabt....dort gibt es die ersten 5 stellen der dateien aus die in dem ordner sind. überprüft aber halt noch nicht die doppelten....hatte es mit deinen hinweisen getestet aber nciht hinbekommen. er hatte immer nur eine zahl ausgegeben aber die war wirklich nur "einmal" vorhanden und nicht doppelt....vielleicht kannst du das ja mal ergänzen und ein wenig mit kommis verziehren. vielen lieben dank #!/usr/bin/perl -w $ordner="/var/tmp/test"; opendir(DIR, $ordner ); @files = readdir(DIR); closedir(DIR); foreach (@files){ $vierzeichen=substr($_,0,5); print $vierzeichen; }
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.