Sehr Umfangreiche Webseite zum Programmieren in C Perl CGI, Skripting, Konvertieren, int ceil sprintf hex oct floor Runden AbschneidenPerl Kurs Skripting Datei Ein/Ausgabe Verzeichnis open read write STDOUT STDIN print sysopen sysread syswrite Datei Ein/Ausgabe Verzeichnis open read write STDOUT STDIN print sysopen sysread syswrite Perl Kurs Kapitel 13

13.7. Funktion read           zurück Ein Kapitel tiefer zum Inhaltsverzeichnis

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.

13.8. Funktionen tell und seek           zurück Ein Kapitel tiefer Ein Kapitel höher zum Inhaltsverzeichnis

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);

13.9. Der Report-Generator write           zurück Ein Kapitel tiefer zum Inhaltsverzeichnis

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 ...

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 ...

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!!!