Perl-Programmierung: Ein-/Ausgabe


Ein-/Ausgabe

Bearbeiten

Nun verfeinern wir das 'Hello World!'-Programm aus den ersten Schritten etwas. Dieses Mal soll das Programm den Benutzer dynamisch ansprechen.

#!/usr/bin/perl
use strict;
use warnings;

# Zur Eingabe auffordern
print "Bitte geben Sie Ihren Namen ein:\n";

# Eine Zeile einlesen
my $name = <STDIN>;

# Zeilenumbruch entfernen
chomp $name;

# Gruß ausgeben
print "Hallo, $name, einen schönen Tag noch!\n";

Die erste Anweisung fordert mit "Bitte geben Sie Ihren Namen ein:" den Nutzer zur Eingabe auf. Die zweite Anweisung liest eine Zeile ein und legt sie in der Variablen $name ab. Dies ist eine skalare Variable, die genau einen Wert aufnehmen kann, dieser eine Wert ist die gesamte eingelesene Zeile. Mit der dritten Anweisung werden abschließende Zeilenumbrüche von der Eingabe entfernt -- wenn die Eingabe von der Tastatur stammt, so ist dies der Zeilenumbruch vom Drücken der Taste Return, mit der man die Eingabe abgeschlossen hat. Die vierte Anweisung gibt einen Gruß aus, nachdem der Wert der Variablen interpoliert wurde.

STDIN ist eine Kurzform für standard input, der Standard-Eingabekanal. Dieser Eingabekanal ist für ein von der Kommandozeile gestartetes Programm die Tastatur.

Nicht zu verwechseln ist <STDIN> mit dem Diamantoperator <>. Der Diamantoperator liest nur dann vom Standard-Eingabekanal ein, wenn beim Start des Programms keine Kommandozeilenargumente angegeben wurden.

Es gibt neben STDIN noch STDOUT, den Standardausgabekanal, und STDERR, den Standardkanal für Fehlermeldungen. Ein- und Ausgaben kommen immer aus einem Kanal beziehungsweise fließen immer dahin.

Der Standard-Eingabekanal muss nicht immer auf die Tastatur zeigen, sondern kann auch umgelenkt werden.

Folgendes Kommandozeilen-Beispiel gibt den Namen Hans aus und leitet die Ausgabe so, dass sie zur Eingabe für obiges Programm, das hier eingabe.pl heißt, wird.

echo Hans | ./eingabe.pl

Folgendes Kommandozeilen-Beispiel gibt den Namen Hans in eine Textdatei aus. Diese Textdatei wird dann zur Eingabe für obiges Programm, das hier eingabe.pl heißt.

echo Hans > name.txt
./eingabe.pl < name.txt

Die beiden Beispiele sind nicht perlspezifisch, sondern abhängig von dem Betriebssystem, und funktionieren auf den gängigen Befehlszeilen vieler UNIX-Varianten.

Das zweite Beispiel zur Eingabeumlenkung liest die Zeile aus einer Datei. Diese Umlenkung kann man auch mit Bordmitteln von Perl erreichen. Hierzu öffnen wir die Datei name.txt selbst und lesen daraus.

#!/usr/bin/perl
use strict;
use warnings;

# Kanal schließen
close (STDIN);

# Datei als Standardeingabe öffnen
open (STDIN, '<', 'name.txt') or die 'Konnte name.txt nicht zum Lesen öffnen';

# Eine Zeile von STDIN einlesen
my $name = <>;

# Zeilenumbruch entfernen
chomp $name;

# Gruß ausgeben
print "Hallo, $name, einen schönen Tag noch!\n";

Die erste Anweisung schließt den (implizit geöffneten) Kanal von der Tastatur, um ihn danach so zu öffnen, dass er aus der Datei name.txt liest. Das zweite Argument, die spitze linke Klammer, bedeutet dabei, dass die Datei zur Eingabe gelesen wird.

  • Lesen Sie mit perldoc -f nach, wie close und open funktionieren.
  • open ist eine sehr mächtige Funktion. Versuchen Sie zunächst nur, ihre Funktionsweise in Ansätzen zu verstehen.
  • Schreiben Sie ein Programm, das Ihren Vor- und Nachnamen von der Tastatur einliest und danach ausgibt.
  • Schreiben Sie Ihr Programm so um, dass es die Eingaben aus einer Datei liest. Hinweis: Der Diamantoperator liest stets eine Zeile ein.
  • Was passiert bei obigem Programm, wenn Sie nichts eingeben oder wenn die Textdatei, aus der Sie einlesen, leer ist? Schlagen Sie die Fehlermeldung auf der Handbuchseite perldiag nach!