 |
|
 |
 |
Mit read haben Sie die Möglichkeit, gepuffert von einem Filehandle einzulesen ...
bytes_rd=read(Filehandle,Puffer, Anzahl Bytes);
Es werden damit also Anzahl Bytes Daten vom Filehandle in den Puffer eingelesen. Ein Programmbeispiel dazu ...
#!/usr/bin/perl -w
open(FH, "Neuedatei.txt") or die $!;
open(BAK,"> backup.bak") or die $!;
$bytes_rd=read(FH, $buffer,50);
print BAK $buffer if $bytes_rd == 50;
close(FH);
close(BAK);
Der Vorteil von read gegenüber ...
$buffer=<FH>;
... liegt daran, dass bestimmt werden kann wie viele Bytes in $buffer eingelesen werden können. Beispielsweise bei einem Eingabe-Formular des Namens bei einem CGI-Skript ...
read(STDIN, $name, 80);
Hier kann der User so viele Zeichen wie er will eingeben. Gelesen werden dennoch nur 80 Zeichen.
Mit der Funktion tell können Sie die aktuelle Position des Filehandle abfragen
und mit
seek können Sie die aktuelle Position ändern. Hier ein Demonstrationsprogramm dazu, was ausreichend kommentiert ist ...
#!/usr/bin/perl -w
use POSIX;
open(FH, "Neuedatei.txt") or die $!;
seek(FH, 5, SEEK_SET); #+5Bytes vom Anfang (SEEK_SET)
$byte=tell FH; #akt. Position abfragen
print "POS.: " , $byte , "\n";
seek(FH, 6, SEEK_CUR); #+6Bytes von der aktuellen
Position(SEEK_CUR) $byte=tell FH;
print "POS.: " , $byte , "\n";
seek(FH, 0, SEEK_END); #Dateiende (SEEK_END)
$byte=tell FH;
print "POS.: " , $byte , "\n";
seek(FH, -20, SEEK_END); #Vom Dateiende 20 Bytes zurück
(SEEK_END) $byte=tell FH;
print "POS.: " , $byte , "\n";
seek(FH, -15, SEEK_CUR); #Von der aktuellen Position 15 Bytes zurück
$byte=tell FH;
print "POS.: " , $byte , "\n";
seek(FH, 0, SEEK_SET); #Zum Dateianfang
$byte=tell FH;
print "POS.: " , $byte , "\n";
close(FH);
Um eine Ausgabe tabellarisch zu Gestallten, bietet sich der Report-Generator write an. Ich glaube jeder kennt das, zum Beispiel in C, die Ausgabe von printf.
Testen ..., Passt nicht, ein Whitespace wegnehmen, wieder testen ..., passt wieder nicht ...u.s.w.
Zuerst müssen Sie dazu den Kopf- und Rumpfteil codieren. Dies geschieht mit dem Befehl
format und endet mit einem '.' ...
format STDOUT_TOP=
.
format STDOUT=
.
Das Suffix _TOP bei STDOUT_TOP bedeutet das es sich hier um den Kopfteil handelt und ohne das Suffix _TOP haben wir den Rumpfteil.
Hierzu ein Beispiel zur Demonstration ...
#!/usr/bin/perl -w
sub Read{
local *FH=shift;
while(<FH>){print;}
}
open(FH_READ,"/usr/include/stdio.h") or die $!;
#!/usr/bin/perl -w
@array1=("Kurs1", "Kurs2", "Kurs3");
@array2=(20.1, 33.2, 30.3);
@array3=("+1.3", "-2,4", "-3.2");
print "\n\n";
for($i=0; $i<3; $i++){
($name, $stand, $plusminus)=($array1[$i],$array2[$i],$array3[$i]);
write;
}
print "\n\n";
format STDOUT_TOP=
****************************************************************
* *
* Kurstand vom 15.10.2001 *
* *
****************************************************************
Kurs Stand Plusminus
------ ------- -----------
.
format STDOUT=
@<<<<<<<<< @<<<<<<<< @<<<<<<<<
$name,$stand,$plusminus
.
Und die Ausgabe lautet ...
****************************************************************
* *
* Kurstand vom 15.10.2001 *
* *
****************************************************************
Kurs Stand Plusminus
------ ------- -----------
Kurs1 20.1 +1.3
Kurs2 33.2 -2,4
Kurs3 30.3 -3.2
Sie sehen es ist total simpel. Folgende Zeilen werden nun genauer erklärt.....
#!/usr/bin/perl -w
open(FH,"dat.csv") or die $!;
while(<FH>){
chomp;
($vorn,$name,$street,$plz,$ort,$alter)=(split(m/,/));
write;
}
print "\n\n";
format STDOUT_TOP=
****************************************************************
* *
* Adressdatenbank 15.10.2001 *
* *
****************************************************************
Vorname Name Strasse PLZ Wohnort Alter
------------------------------------------------------------------------------
.
format STDOUT=
@<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<<
@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<
@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<<<<
$vorn,$name,$street,$plz,$ort,$alter
.
Dies ist der Rumpfteil oder Body wenn Sie wollen. Diese @<<<<<
sind
Platzhalter. Darunter befinden sich die Variablen. Es sind genau drei Platzhalter und drei Variablen zu finden, was bedeutet, das die Platzhalter durch die Variablen ersetzt werden. Folgende Platzhalter gibt es in Perl ...
- @<<<<<<< - Linksbündig; @ plus Anzahl '<' geben die Länge des Ausgabenfeldes an
- @>>>>>>> - Rechtsbündig; @ plus Anzahl '>' geben die Länge des Ausgabenfeldes an
- @|||||| - Zentrierte Ausgabe; @ plus Anzahl '|' geben die Länge des Ausgabenfeldes an.
- @###.### - Zahlenformat
Ausgelöst wird die ganze Ausgabe durch den Aufruf mit write.
Das Beispiel von soeben hat eigentlich nicht viel Sinn gemacht. Sinnvoller ist es schon,
Beispielsweise eine CSV-Datei (dies ist eine Datei wo die einzelnen Elemente ein bestimmtes Trennzeichen haben, meist ein Komma oder Kommata)
einzulesen ...
Frank,Mustermann,Musterstrasse 10,88888,Musterhausen,33
Albert,Scheizer,Kleinhausstrasse 5,12345,Augsburg,99
Stefan,Wecker,Kohlstrasse 8,32343,Berlin,23
Diese Datei, nennen wir Sie dat.csv, lesen Sie nun mit folgendem Programm ein und geben diese sauber formatiert mit dem Report-Generator aus ...
#!/usr/bin/perl -w
open(FH,"dat.csv") or die $!;
while(<FH>){
chomp;
($vorn,$name,$street,$plz,$ort,$alter)=(split(m/,/));
write;
}
print "\n\n";
format STDOUT_TOP=
Seite: @<<Name< des Formats: @<<Name<<Kopfseite<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<
$%,$~,$^
Zeilen pro Seite : @<<briggebliebenen<<<< Ü : @<<<<<<<<<<<<<<<<<
$=,$-
Vorname Name Strasse PLZ Wohnort Alter
------------------------------------------------------------------------------
.
format STDOUT=
@<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
@<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<
$vorn,$name,$street,$plz,$ort,$alter
.
Auch für den Report-Generator gibt es reservierte Variablen ...
- $~ - Name des Formats
- $^ - Name des Kopfformats
- $% - Aktuelle Seite
- $= - Anzahl Zeilen pro Seite
- $- - Anzahl Zeile die noch Übrig sind pro Seite
Auch zu den reservierten Variablen folgt nun ein Beispielsskript ...
#!/usr/bin/perl -w
open(FH,"dat.csv") or die $!;
while(<FH>){
chomp;
($vorn,$name,$street,$plz,$ort,$alter)=(split(m/,/));
write;
}
print "\n\n";
format STDOUT_TOP=
Seite: @<<Name< des Formats: @<<Name<<Kopfseite<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<
$%,$~,$^
Zeilen pro Seite : @<<briggebliebenen<<<< Ü : @<<<<<<<<<<<<<<<<<
$=,$-
Vorname Name Strasse PLZ Wohnort Alter
------------------------------------------------------------------------------
.
format STDOUT=
@<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<<
@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
@<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<
$vorn,$name,$street,$plz,$ort,$alter
.
HINWEIS: Wegen Darstellungsproblemen mussten einige Zeilen mit @<<<.... gebrochen werden!!!
|
|
 |
 |
 |