User since
2005-07-05
2
Artikel
BenutzerIn
Hi,
Ich möchte aus einem gegebenen Verzeichnis alle Dateien auslesen, die die Dateiendung .txt haben und mit jeder dieser Dateien die gleiche Aktion ausführen.
Als Ergebnis dieser Aktion entstehen Dateien mit der Endung .sql, die ich ebenfalls wieder alle brauche, um damit noch etwas zu machen. Die Dateinamen selbst sind dabei aber gleich, d.h. aus der Datei test1.txt wird die Datei test1.sql erzeugt.
Die Anzahl und die Namen der Dateien sind variabel, eine feste Liste aufzuschreiben bringt es also nicht.
Kann mir da jemand helfen?
Grüsse Maddy
User since
2004-03-22
5697
Artikel
ModeratorIn + EditorIn
hm schritt 1 nimm mal esskars code der alle dateien eines verzeichnisses öffnet:
http://board.perl-community.de/cgi-bin....8;#idx2
das print <$file> nimm raus weil du ja nichts ausgeben willst und da du ja nur die txt dateien willst füge dazu:
next unless $filename =~ m!\.txt$!;
jetzt kannst cor dem close mit jeder deiner dateien deine magische operation machen mit einer ähnlichen regex kannst du dann auch den neues dateinamen erzeugen:
$filename =~ s!\.txt\z!\.sql!;
User since
2004-03-22
5697
Artikel
ModeratorIn + EditorIn
seh jetzt renees lösung ja so geht es auch Tim ist heute
User since
2003-08-04
5872
Artikel
ModeratorIn
ich würd ja die Textdateien einfach globben:
my @txt = glob(*.txt);
my @sql = map {$a=$_;$a=~s~\.txt$~.sql~;$a} @txt;
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;
use strict; use warnings; Link zu meiner Perlseite
User since
2005-07-05
2
Artikel
BenutzerIn
ich danke herzlich für Eure Bemühungen, gleich die erste Version hat gemacht was sie sollte und nun funzt das alles.
Dankeschön
Gruss Maddy:D
User since
2003-08-04
2145
Artikel
ModeratorIn + EditorIn
[quote=Crian,05.07.2005, 11:01]ich würd ja die Textdateien einfach globben:
[/quote]
Ja, das wuerde ich auch.
Quote
my @txt = glob(*.txt);
my @sql = map {$a=$_;$a=~s~\.txt$~.sql~;$a} @txt;
Das map{} erscheint mir hier etwas holprig. Ich wuerde eine for-Schleife der Uebersichtlichkeit halber bevorzugen, auch wenn's wahrscheinlich etwas laenger dauert (erst kopieren, dann ersetzen):
my @txt = glob('*.txt');
my @sql = @txt;
s~\.txt$~.sql~ for @txt;
User since
2005-02-18
357
Artikel
BenutzerIn
Für das Problem "Brauche das Ergebnis von s/// (nicht den Rückgabewert) im map-Zusammenhang" suche ich auch noch nach einer eleganten Lösung.
I sense a soul in search of answers.
User since
2003-08-04
12208
Artikel
Admin1
[quote=pKai,05.07.2005, 23:12]Für das Problem "Brauche das Ergebnis von s/// (nicht den Rückgabewert) im map-Zusammenhang" suche ich auch noch nach einer eleganten Lösung.[/quote]
hmm. sowas?
# beläßt original so wie es ist
sub cmap (&@) {
map { local $_ = $_; $_[0]->(); $_ } @_[1..$#_];
}
my @copy = cmap { s/a/b/ } @array;
edit: umbenannt,
$_[0]->() statt
$_[0]->($_)\n\n
<!--EDIT|pq|1120741872-->
User since
2005-02-18
357
Artikel
BenutzerIn
Mit einer eigenen Prototyp-sub zu arbeiten wäre 'ne Idee (an die ich bisher noch nicht gedacht hatte).
Mal schauen wie's sich macht, wenn ich das nächste mal sowas brauche.
Danke
I sense a soul in search of answers.