Hyäne Geschrieben 8. Juli 2008 Geschrieben 8. Juli 2008 (bearbeitet) 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 2008 von Hyäne Zitieren
Amstelchen Geschrieben 8. Juli 2008 Geschrieben 8. Juli 2008 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 Zitieren
Hyäne Geschrieben 8. Juli 2008 Autor Geschrieben 8. Juli 2008 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... Zitieren
bigvic Geschrieben 8. Juli 2008 Geschrieben 8. Juli 2008 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 Zitieren
Hyäne Geschrieben 9. Juli 2008 Autor Geschrieben 9. Juli 2008 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. Zitieren
bigvic Geschrieben 9. Juli 2008 Geschrieben 9. Juli 2008 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 Zitieren
Hyäne Geschrieben 9. Juli 2008 Autor Geschrieben 9. Juli 2008 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 Zitieren
bigvic Geschrieben 15. Juli 2008 Geschrieben 15. Juli 2008 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 Zitieren
Carnie Geschrieben 15. Juli 2008 Geschrieben 15. Juli 2008 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. Zitieren
Hyäne Geschrieben 17. Juli 2008 Autor Geschrieben 17. Juli 2008 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; } Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.