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
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
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...
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
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.
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
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
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
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.
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; }
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden