Thread Dir ohne Unterordner in .txt Datei u.ä.. Wie? (60 answers)
Opened by stormy2211 at 2007-11-02 21:31

topeg
 2007-11-03 01:30
#101723 #101723
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Zu "Array"
Allso Ein Array ist eine Liste von Werten und wird unter Perl mit einem "@" am Anfang markiert.

Zu "my"
"my" Deklariert eine Variable. Damit Erkennt Perl, dass du sie Bewusst einführst und dich nicht irgendwo verschrieben hast (Noch ein paar Sachen mehr aber das ist erstmal nicht von belang.) Das bringt aber nur in Verwendung mit "use strict;" etwas.

Zu "$1"
Wenn du es ganz genau wissen willst mußt du dich über Reguläre ausdrücke informieren.
Aber kurz. Da steht drin was der Reguläre Ausdruck gefunden hat. Um den Ausdruck den ich oben verwendet habe zu erklären:
Mit einem Regulärer Ausdruck versucht einen zu String so allgemein wie möglich und so genau wie nötig zu beschreiben. Dazu gibt es eine Reihe von Schlüsseln (meisst einzelne Zeichen)
Also zu diesem Regulären Ausdruck:
$Filename=~/^(.+?)@/s;
Heißt so viel wie "Übergieb das an $1 was zwischen dem Anfang des Stringes und dem nächsten @ steht"
Speziell:
"=~//" Sagt Perl es handelt sich um ein Regexp. Alles zwischen den "/" ist der Reguläre Ausdruck selber.
"^" Ist die "Umschreibung" für den Stinganfang
"()" alles was da zwischen steht landet in "$1"
"." "Umschreibung" für ein beliebiges Zeichen. Alle Zeichen passen darauf.
"+?" finde die Vorherige "Umschreibung" mindestens Einmal und gehe nur soweit bis die hinten dran stehende "Umschreibung" oder Zeichen gefunden wird.
"@" das Zeichen "at" selber.

zu "for my"
Wie oben beschrieben dient "my" dazu eine Variable zu definieren. Das kann man an nache zu jeder beliebigen Stelle im Code machen. Diese spezielle Schreibweise hat sich "Eingebürgert"
Alls Beispiel sind gleichbedeutend:

Code (perl): (dl )
1
2
my $var;
foreach $var (@liste)

Code (perl): (dl )
1
2
my $var;
for $var (@liste)

Code (perl): (dl )
1
2
3
4
my $var;
my $i;
for($i=0; $i<@liste; $i++){
  $var=$liste[$i];

Code (perl): (dl )
1
2
3
my $var;
for(my $i=0; $i<@liste; $i++){
  $var=$liste[$i];

Code (perl): (dl )
foreach my $var (@liste) 

Code (perl): (dl )
for my $var (@liste)


zu "join"
"join" fügt Arrays (und Listen) mit einem Zeichen als Trenner zwischen den einzelnen Arrayeinträgen zusammen. Alls Beispiel;
wir haben das Array
Code (perl): (dl )
@array=("Das","ist","ein","Satz.")

Code (perl): (dl )
join(" ",@array)

gibt nun "Das ist ein Satz." zurück
Oder
Code (perl): (dl )
join("\n",@array)

liefert zurück:
"Das
ist
ein
Satz."
Oder
Code (perl): (dl )
join(" Bla ",@array)

Liefert: "Das Bla ist Bla ein Bla Satz."

Ich bei meiner Überarbeitung deines Scriptes leider das ausschließen der Verzeichnisse und ein paar nützliche Fehlermeldungen vergessen.
Darum hier das Script noch mal:
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
#!C:\\Perl\bin\perl.exe

# Verhintert Vertipper, fehlerhafte Definitionen und noch so manches Ärgernis :)
###################################
use strict;
use warnings;
###################################

# mit Windowspfaden kenne ich mich nicht so aus,
# aber Perl wandelt die Unixspezifische Schreibweise normalerweise passend um. 
#opendir(Musik, 'C://Dokumente und Einstellungen/Stormy/Eigene Dateien/Eigene Musik');
#ist mein Musikverzeichnis was ich hier öffne
#my @Liederliste=readdir Musik;
#hier speichere ich das Verzeichnis als
#.txt Datei in die @Liederliste
#closedir(Musik);

###################################
my @Liederliste
# "open" mit Fehlermeldung wenn es nicht klappt.
opendir(Musik, 'C://Dokumente und Einstellungen/Stormy/Eigene Dateien/Eigene Musik') or die "Konnte Ordner nicht öffnen ($!)\n";
while(my $Filename =readdir(Musik))
{
 # "." und ".." überspringen
 next if($Filename eq '.' or $Filename eq '..');
 # Ist es eine datei?
 if(-f 'C://Dokumente und Einstellungen/Stormy/Eigene Dateien/Eigene Musik/'.$Filename)
 {
  push(@Liederliste,$Filename);
 }
}
closedir(Musik);
###################################


#$Anzahllieder=@Liederliste; # Wenn ein Array skalar abgefragt wird, wird nur die Anzahl der Eintträge übergeben 
#hier zähle ich die Anzahl meiner Lieder durch

# das funktioniert so leider nicht
##################################
#for ($s=0;$s<=$Anzahllieder;$s=$s+1)
#Angabe wieviele Titel es der Liste hinzufügen soll
#{$Titel=index($Liederliste[$s],"@");push(@Titelliste,$Titel);}
#Befehl dass nur die einzelnen Werte der Liste bis zum "@"-Zeichen gelesen
#werden und in einer extra Liste abgespeichert werden
###################################
# Index lifert die Position eines Stinges innerhalb eines anderen.
# @Titelliste wird bei jedem Durchlauf neu initialisiert
# und außerhalb der Schleife ist es unbekannt.
# Wenn man ein ganzes Array durch gehen will, so kann man das auch anders schreiben:
# for my $filename (@Liederliste);
# Außerdem "$s=$s+1" kann man auch so schreiben "$s++"
# weiterhin müßte es "$s<$Anzahllieder" heißen, denn in "$Anzahllieder" steht die Anzahl der Einträge,
# aber im Array wird von 0 an gezählt und damit ist der letzte Eintrag "$Anzahllieder-1"

##################################
# so würde ich es machen:
my @Titelliste; # das Array vor der Scheife definieren!
for my $Filename (@Liederliste);
{
 # siehe Reguläre Ausdrücke
 $Filename=~/^(.+?)@/s;
 push(@Titelliste,$1);
}
##################################


open(SPEICHERN,'>','C://Meine Verwaltung von Multimedia/Musik/Liederliste.txt') or die "Konnte Liderliste nicht Speichern ($!)\n";
print SPEICHERN join("\n",@Liederliste);
close(SPEICHERN);

open(SPEICHERN2,'>','C://Meine Verwaltung von Multimedia/Musik/Titelliste.txt') or die "Konnte Titelliste nicht Speichern ($!)\n";
print SPEICHERN2 join("\n",@Titelliste);
close(SPEICHERN2);
#Speicherung der 2 Listen in meinem Verwaltungsordner.

# Leere Zeilen helfen den Code etwas zu strukturieren.
# Einrücken genauso :)

View full thread Dir ohne Unterordner in .txt Datei u.ä.. Wie?