FILEHANDLE und andere Anfänger-Frage
FILEHANDLE und andere Anfänger-Frage
am 12.04.2006 08:40:21 von Marek Stepanek
Hallo happy Perlers,
ich habe eine Liste, in der alle Rechnungen aufgelistet sind:
rech_reza_list_2006.txt :
Rechnr: 11 Datum: 15.03.2006 - 31.03.2006 Total: 470.00
Rechnr: 12 Datum: 15.03.2006 - 31.03.2006 Total: 320.00
Rechnr: 13 Datum: 15.03.2006 - 31.03.2006 Total: 243.00
Rechnr: 14 Datum: 15.03.2006 - 31.03.2006 Total: 382.50
Rechnr: 15 Datum: 15.03.2006 - 31.03.2006 Total: 943.00
Ich will zu dieser Liste am Ende eine Zeile hinzufügen, mit der letzten
Rechnungsnummer + 1 , und andere Variablen wie Datum und Totalsumme.
Wenn ich die FILEHANDLE richtig verstanden habe, kann ich *nicht* eine Datei
öffnen zum Lesen *UND* Schreiben? Ich muss die Datei erst öffnen, einlesen,
schließen und dann zum Schreiben wieder öffnen?
Meine Versuche sehen so aus - bitte Geduld, ich bin Anfänger :-)
Danke für Eure Hilfe
marek
#!/usr/bin/perl -w
use strict;
my $rech_nr = 0; #muss ich mit Null Initialisieren?
my $all_datei = "rech_reza_list_2006.txt";
open ALL, "$all_datei" or die "Error! $!\n;";
my @lines = readdir ALL;
close ALL;
foreach my $line (@lines) {
# matches: "Rechnr: 11 Datum: 15.03.2006 - 31.03.2006 Total:
470.00"
$rech_nr = $1 if $line =~ /^Rechnr: (\d+)\t/;
print "this is the scalar \$rech_nr: $rech_nr in $line\n";
# das nur zu Testzwecken. Prints nothing :-(
}
$rech_nr++;
open ALL, ">>$all_datei" or die "Error! $!\n;";
print ALL "\$rech_nr is now $rech_nr! \n";
close ALL;
__DATA__
Rechnr: 11 Datum: 15.03.2006 - 31.03.2006 Total: 470.00
Rechnr: 12 Datum: 15.03.2006 - 31.03.2006 Total: 320.00
Rechnr: 13 Datum: 15.03.2006 - 31.03.2006 Total: 243.00
Rechnr: 14 Datum: 15.03.2006 - 31.03.2006 Total: 382.50
Rechnr: 15 Datum: 15.03.2006 - 31.03.2006 Total: 943.00
Re: FILEHANDLE und andere Anfänger-Frage
am 12.04.2006 09:15:53 von Frank Seitz
Marek Stepanek wrote:
>
>
> Hallo happy Perlers,
>
>
> ich habe eine Liste, in der alle Rechnungen aufgelistet sind:
>
>
> rech_reza_list_2006.txt :
>
> Rechnr: 11 Datum: 15.03.2006 - 31.03.2006 Total: 470.00
> Rechnr: 12 Datum: 15.03.2006 - 31.03.2006 Total: 320.00
> Rechnr: 13 Datum: 15.03.2006 - 31.03.2006 Total: 243.00
> Rechnr: 14 Datum: 15.03.2006 - 31.03.2006 Total: 382.50
> Rechnr: 15 Datum: 15.03.2006 - 31.03.2006 Total: 943.00
>
>
> Ich will zu dieser Liste am Ende eine Zeile hinzufügen, mit der letzten
> Rechnungsnummer + 1 , und andere Variablen wie Datum und Totalsumme.
>
> Wenn ich die FILEHANDLE richtig verstanden habe, kann ich *nicht* eine Datei
> öffnen zum Lesen *UND* Schreiben? Ich muss die Datei erst öffnen, einlesen,
> schließen und dann zum Schreiben wieder öffnen?
>
> Meine Versuche sehen so aus - bitte Geduld, ich bin Anfänger :-)
>
>
> Danke für Eure Hilfe
>
>
> marek
>
>
>
> #!/usr/bin/perl -w
> use strict;
>
> my $rech_nr = 0; #muss ich mit Null Initialisieren?
>
> my $all_datei = "rech_reza_list_2006.txt";
> open ALL, "$all_datei" or die "Error! $!\n;";
> my @lines = readdir ALL;
> close ALL;
>
>
> foreach my $line (@lines) {
> # matches: "Rechnr: 11 Datum: 15.03.2006 - 31.03.2006 Total:
> 470.00"
> $rech_nr = $1 if $line =~ /^Rechnr: (\d+)\t/;
> print "this is the scalar \$rech_nr: $rech_nr in $line\n";
> # das nur zu Testzwecken. Prints nothing :-(
> }
>
> $rech_nr++;
>
>
>
> open ALL, ">>$all_datei" or die "Error! $!\n;";
> print ALL "\$rech_nr is now $rech_nr! \n";
>
> close ALL;
>
> __DATA__
>
> Rechnr: 11 Datum: 15.03.2006 - 31.03.2006 Total: 470.00
> Rechnr: 12 Datum: 15.03.2006 - 31.03.2006 Total: 320.00
> Rechnr: 13 Datum: 15.03.2006 - 31.03.2006 Total: 243.00
> Rechnr: 14 Datum: 15.03.2006 - 31.03.2006 Total: 382.50
> Rechnr: 15 Datum: 15.03.2006 - 31.03.2006 Total: 943.00
>
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: FILEHANDLE und andere Anfänger-Frage
am 12.04.2006 09:25:08 von Reinhard Pagitsch
Marek Stepanek wrote:
>
>
> Hallo happy Perlers,
>
>
[einiges gesnipped]
>
>
> Ich will zu dieser Liste am Ende eine Zeile hinzufügen, mit der letzten
> Rechnungsnummer + 1 , und andere Variablen wie Datum und Totalsumme.
>
> Wenn ich die FILEHANDLE richtig verstanden habe, kann ich *nicht* eine Datei
> öffnen zum Lesen *UND* Schreiben? Ich muss die Datei erst öffnen, einlesen,
> schließen und dann zum Schreiben wieder öffnen?
>
> Meine Versuche sehen so aus - bitte Geduld, ich bin Anfänger :-)
open(FH, "+
perldoc -f open
Soweit ich das sehe geht auch: open(FH, "+>>filename.ext") or die "$!";
Es kann aber auch sysopen im Mode O_RDWR (lesen+schreiben), IO::File,
FileHandle verwendet werden. Einfach im CPAN danach suchen.
>
>
> Danke für Eure Hilfe
> marek
Gerne,Reinhard
>
>
>
> #!/usr/bin/perl -w
> use strict;
>
> my $rech_nr = 0; #muss ich mit Null Initialisieren?
>
> my $all_datei = "rech_reza_list_2006.txt";
> open ALL, "$all_datei" or die "Error! $!\n;";
> my @lines = readdir ALL;
> close ALL;
>
>
> foreach my $line (@lines) {
> # matches: "Rechnr: 11 Datum: 15.03.2006 - 31.03.2006 Total:
> 470.00"
> $rech_nr = $1 if $line =~ /^Rechnr: (\d+)\t/;
> print "this is the scalar \$rech_nr: $rech_nr in $line\n";
> # das nur zu Testzwecken. Prints nothing :-(
> }
>
> $rech_nr++;
>
>
>
> open ALL, ">>$all_datei" or die "Error! $!\n;";
> print ALL "\$rech_nr is now $rech_nr! \n";
>
> close ALL;
>
> __DATA__
>
> Rechnr: 11 Datum: 15.03.2006 - 31.03.2006 Total: 470.00
> Rechnr: 12 Datum: 15.03.2006 - 31.03.2006 Total: 320.00
> Rechnr: 13 Datum: 15.03.2006 - 31.03.2006 Total: 243.00
> Rechnr: 14 Datum: 15.03.2006 - 31.03.2006 Total: 382.50
> Rechnr: 15 Datum: 15.03.2006 - 31.03.2006 Total: 943.00
>
--
regards,
Reinhard
PM replays nur an reinhard dot pagitsch at isis-papyrus dot com.
Die Adresse im From/Replay To wird nicht gelesen.
Re: FILEHANDLE und andere Anfänger-Frage
am 12.04.2006 09:58:27 von Mirco Wahab
Hallo Marek
> Wenn ich die FILEHANDLE richtig verstanden habe, kann ich *nicht* eine Datei
> öffnen zum Lesen *UND* Schreiben? Ich muss die Datei erst öffnen, einlesen,
> schließen und dann zum Schreiben wieder öffnen?
> Meine Versuche sehen so aus - bitte Geduld, ich bin Anfänger :-)
'Perl Cookbook',
"7.10. Modifying a File in Place Without a Temporary File"
sagt:
# Open the file in update mode ("+<"), read the
# whole file into an array of lines, change the
# array, then rewrite the file and truncate it
# to its current seek pointer.
open(FH, "+< FILE") or die "Opening: $!";
@ARRAY = ;
# change ARRAY here
seek(FH,0,0) or die "Seeking: $!";
print FH @ARRAY or die "Printing: $!";
truncate(FH,tell(FH)) or die "Truncating: $!";
close(FH) or die "Closing: $!";
Frage: was soll Deine Zeile:
my @lines = readdir ALL;
bewirken?
Viele Grüße
M.
Re: FILEHANDLE und andere Anfänger-Frage
am 12.04.2006 10:27:38 von Andreas Fenner
Am 12.04.2006 08:40 schrieb Marek Stepanek:
> ...
> #!/usr/bin/perl -w
> use strict;
>
> my $rech_nr = 0; #muss ich mit Null Initialisieren?
>
> my $all_datei = "rech_reza_list_2006.txt";
> open ALL, "$all_datei" or die "Error! $!\n;";
Hier hast du ein File zum lesen auf gemacht
> my @lines = readdir ALL;
und hier liest du aus einem Filehandle Directoryeinträge aus. Ich glaube
nicht das dies was sinnvolles liefern kann...
Andreas
Re: FILEHANDLE und andere Anfänger-Frage
am 12.04.2006 13:35:31 von Marek Stepanek
On 12.04.2006 10:27, in article 1144830458.132227@slbhw0, "Andreas Fenner"
wrote:
> Am 12.04.2006 08:40 schrieb Marek Stepanek:
>
>> ...
>> #!/usr/bin/perl -w
>> use strict;
>>
>> my $rech_nr = 0; #muss ich mit Null Initialisieren?
>>
>> my $all_datei = "rech_reza_list_2006.txt";
>> open ALL, "$all_datei" or die "Error! $!\n;";
>
> Hier hast du ein File zum lesen auf gemacht
>
>> my @lines = readdir ALL;
>
> und hier liest du aus einem Filehandle Directoryeinträge aus. Ich glaube
> nicht das dies was sinnvolles liefern kann...
>
>
> Andreas
Danke für alle Antworten! Das ist wirklich eine große Hilfe gewesen. Damit
komme ich erstmal weiter.
Grüße an alle aus München
marek
Re: FILEHANDLE und andere Anfänger-Frage
am 12.04.2006 14:01:51 von Marek Stepanek
hoffentlich strapaziere ich nicht Eure Geduld ...
mein Skript ist, glaube ich auf dem richtigen Weg. In Anlehnung an Mirko
Wahabs Vorschlag, sieht mein Skript jetzt so aus:
zur Erinnerung, die Daten, die eingelesen werden sollen:
Rechnr: 11 Datum: 15.03.2006 - 31.03.2006 Total: 470.00
Rechnr: 12 Datum: 15.03.2006 - 31.03.2006 Total: 320.00
Rechnr: 13 Datum: 15.03.2006 - 31.03.2006 Total: 243.00
Rechnr: 14 Datum: 15.03.2006 - 31.03.2006 Total: 382.50
Rechnr: 15 Datum: 15.03.2006 - 31.03.2006 Total: 943.00
Und meine Fragen als Kommentar in dem Skript selbst ...
#!/usr/bin/perl -w
use strict;
my $rech_nr = 0; # muss ich inizialisieren?
my $all_datei = "rech_reza_list_2006.txt";
open ALL, "+< $all_datei" or die "Error! $!\n;";
my @lines = ;
while (<@lines>) {
# matches: "Rechnr: 11 Datum: 15.03.2006 - 31.03.2006 Total:
470.00"
$rech_nr = $1 if $_ =~ /^Rechnr: (\d+)\t/; #das soll eigentlich *nur*
die *letzte* Rechnungsnummer in der Variablen $rech_nr einlesen. Geht das
nicht einfacher? Und leider wird die var $rech_nr nicht weitergegeben...
}
$rech_nr+= 1;
push @lines, "\n\$rech_nr is now $rech_nr! \n"; #warum ist $rech_nr = 1 ?
und nicht 15+1=16 ?
seek(ALL,0,0) or die "Seeking: $!";
print ALL @lines or die "Printing: $!";
truncate(ALL,tell(ALL)) or die "Truncating: $!";
close(ALL) or die "Closing: $!"; #ganz verstehe ich den Trick
aus dem Perl Cookbook nicht. Aber ich werde demnächst nachlesen, was genau
mit dem truncate gemeint ist und vorallem wozu ...
Kann erst heute Abend mich für Eure Hilfe bedanken :-)
marek
Re: FILEHANDLE und andere Anfänger-Frage
am 12.04.2006 14:35:04 von Wolf Behrenhoff
Marek Stepanek schrieb:
>
> Und meine Fragen als Kommentar in dem Skript selbst ...
>
> my $rech_nr = 0; # muss ich inizialisieren?
Nein, da du $rech_nr ja später sowieso neu setzt.
Ansonsten:
Ich würde anders vorgehen. Was hast du für einen Vorteil, wenn du die
Datei zum Lesen und Schreiben öffnest? (Ich gehe mal davon aus, dass
nicht mehrere Instanzen deines Programms gleichzeitig die Datei lesen
und eine Zeile anhängen)
Dann könntest du mit File::ReadBackwards einfach die letzte Zeile lesen
und dann eine neue Zeile dranhängen.
also z.B. so (ungetestet)
use File::ReadBackwards;
use strict;
use warnings;
my $datei = "rech_reza_list_2006.txt";
my $in = File::ReadBackwards->new($datei) or die $!;
my $zeile = $in->readline;
$in->close;
open(my $out, '>>', $datei) or die $!;
my $neueNummer;
if ($zeile =~ /^Rechnr: (\d+)\t/) {
$neueNummer = $1+1;
} else {
$neueNummer = 1;
}
print $out "Rechnr: $neueNummer\t und so weiter\n";
close $out;
> #ganz verstehe ich den Trick
> aus dem Perl Cookbook nicht. Aber ich werde demnächst nachlesen, was genau
> mit dem truncate gemeint ist und vorallem wozu ...
truncate schneidet eine Datei ab. Es wird dort im Beispiel erst die
gesamte Datei eingelesen, dann an den Dateianfang geseekt, die gesamte
Datei neu geschrieben und schließlich am Ende abgeschnitten (falls die
neuen Daten weniger sind als vorher). Du musst hier allerdings natürlich
nicht die Datei komplett neu schreiben, wenn du nur eine Zeile anhängen
willst. Auch brauchst du nicht die komplette Datei einzulesen.
Wolf