| # Vordefinierte Variablen in Perl
| Allgemeines zu vordefinierten Variablen Vordefinierte Skalare Vordefinierte Listen und Hashes

## Allgemeines zu vordefinierten Variablen

Perl hält eine Fülle spezieller vordefinierter Variablen bereit. Den Inhalt dieser Variablen können Sie auslesen, um Informationen zur aktuellen Perl-Konfiguration zu ermitteln, oder um die Systemkonfiguration des Rechners, auf dem das Script und der Perl-Interpreter laufen, zu ermitteln. Einige der Variablen sind aber auch Hilfsvariablen, die das Programmieren erleichtern. So gibt es z.B. eine Variable, die in einer Schleife den jeweils aktuellen Wert bereitstellt, oder eine Variable, die übergebene Parameter speichert.

Viele der vordefinierten Variablen sehen optisch übel aus und sind ein Mitgrund, warum Perl mancherorts als unverständliche Hacker-Sprache gilt. Denn wer sich nicht mit Perl auskennt, für den sind Variablennamen wie `$_`, `$/`, `$"` oder `$%` eine Zumutung. Neben dieser klassischen Kurznotation gibt es deshalb auch "Klartext"-Varianten dieser Variablen. Doch dazu muss man ein Modul namens `English` einbinden, das jedoch den Nachteil hat, dass es die Ausführungsgeschwindigkeit des Scripts senkt und wie alle anderen Module auch den Ressourcenbedarf erhöht. Demgegenüber steht der Vorteil, dass Ihr Programm besser lesbar ist.

Das folgende Beispiel zeigt einige der vordefinierten Variablen in Aktion:

### Beispiel eines vollständigen CGI-Scripts in Perl:

Anzeigebeispiel: So sieht's aus (Zum Aufruf des Scripts ist eine Internet-Verbindung erforderlich)

    #!/usr/bin/perl -w

    use strict;
    use CGI::Carp qw(fatalsToBrowser);
    use English;

    print "Content-type: text/plain\n\n";
    print "===Vordefinierte Skalare====================================\n\n";
    print "Prozessnummer dieses laufenden Prozesses: $$ oder $PID\n";
    print "Bei diesem Prozess ausgeführte Datei:  $0 oder $PROGRAM_NAME \n";
    print "Bei diesem Prozess ausgeführender Interpreter:  $^X oder $EXECUTABLE_NAME \n";
    print "Versionsnummer des Perl-Interpreter:  $] oder $PERL_VERSION \n";
    print "Startzeit des Prozesses:  $^T oder $BASETIME \n";
    print "Betriebssystem:  $^O oder $OSNAME \n";
    print "\n\n===Vordefinierte Listen=====================================\n\n";
    print "Übergebene Argumente:\n";
    my $i = 0;
    foreach (@ARGV) {
      print ++$i,". Argument: $_\n";
    }
    $i = 0;
    print "\nSuchpfad für Perl-Module:\n";
    foreach (@INC) {
      print ++$i,". Pfad: $_\n";
    }
    print "\n\n===Vordefinierter Hash======================================\n\n";
    foreach (keys %ENV) {
      printf " %20s:  $ENV{$_} \n",$_;
    }

### Erläuterung:

Das Beispiel sendet mit dem MIME-Typ `text/plain` Text an den aufrufenden Browser. Dabei werden die Werte verschiedener vordefinierter Variablen ausgegeben. Einige werden zur Kontrolle zweimal ausgegeben, nämlich einmal in der klassischen Kurzform und einmal in der Klartextform, die aber nur möglich ist, weil mit `use English;` das entsprechende Standardmodul eingebunden wird. So enthalten beispielsweise `$$` und `$PID` den gleichen Wert.

Die einzelnen Elemente vordefinierter Arrays und Hashes wie `@ARGV`, `@INC` und `%ENV` werden in dem Script jeweils mit Hilfe einer foreach-Schleife sauber formatiert ausgegeben. Dabei wird auch der vordefinierte Skalar `$_` verwendet, der wohl die am häufigsten in der Praxis verwendete vordefinierte Variable ist.

Der Array `@ARGV` ist übrigens leer, solange Sie das Script ohne Kommandozeilen-Parameter aufrufen.

## Vordefinierte Skalare

Die Tabellen beschreiben vordefinierte Skalare. Beispiele sind nur dort vorhanden, wo keine größere Beispielumgebung erforderlich ist. Einige der Skalare sind betriebssystemspezifisch bzw. ausschließlich in Unix-Umgebungen von Bedeutung.

Um die Langformen der Variablen zu nutzen, müssen Sie mit `use English;` das entsprechende Standardmodul in Ihr Script einbinden.

### Vordefinierte Skalare für Programmablauf und reguläre Ausdrücke

Kurzform | Langform | Bedeutung | Kleines Beispiel
--- | --- | --- | ---
`$_` | `$ARG` | Enthält in Schleifen (z.B. bei der Suche in einer Liste mit foreach), wenn keine andere Variable angegeben wurde, den jeweils aktuellen Wert bzw. das jeweils aktuelle Argument. Wird von einigen Perl-Funktionen als Argument akzeptiert, d.h. den Funktionen muss kein expliziter Wert übergeben werden, wenn `$_` als Argument gemeint ist. Enthält bei Operationen mit regulären Ausdrücken den jeweils aktuellen Wert. |
    @Zahlen = (1..10);
    foreach(@Zahlen) {
     print $_, "\n";
    }
`$1`, `$2` usw. | `` | Enthält bei Operationen mit regulären Ausdrücken mit runden Klammern jeweils den Wert eines gemerkten Teilausdrucks. Nur lesbar, nicht änderbar. |
    if(/from: (.*)/) {
     $Absender = $1;
    }
`$&` | `$MATCH` | Enthält nach Anwenden eines regulären Ausdrucks den letzten Wert, auf den das Suchmuster passte. Nur lesbar, nicht änderbar. Die Verwendung dieser Variablen verlangsamt das gesamte Programm, daher wird die Benutzung von Profis nicht empfohlen. |
    $_ = "Mann und Frau";
    /und/;
    print "$&\n";
`$`` | `$PREMATCH` | Enthält den Teil des Gesamtausdrucks vor dem letzten Wert, auf den das Suchmuster passte. Nur lesbar, nicht änderbar. Das ``` ist das Accent-grave-Zeichen. Auf vielen Tastaturen Shift-Taste und Accent-Taste drücken, dann ein Leerzeichen tippen. Die Verwendung dieser Variablen verlangsamt das gesamte Programm, daher wird die Benutzung von Profis nicht empfohlen. |
    $_ = "Mann und Frau";
    / und/;
    print "$`\n";
`$'` | `$POSTMATCH` | Enthält den Teil des Gesamtausdrucks nach dem letzten Wert, auf den das Suchmuster passte. Nur lesbar, nicht änderbar. Das `'` ist der einfache Apostroph. Die Verwendung dieser Variablen verlangsamt das gesamte Programm, daher wird die Benutzung von Profis nicht empfohlen. |
    $_ = "Mann und Frau";
    /und /;
    print "$'\n";
`$+` | `$LAST_PAREN_MATCH` | Enthält nach Anwenden eines regulären Ausdrucks mit Klammern den Inhalt der letzten Klammer. Nur lesbar, nicht änderbar. |
    $_ = "Mann und Frau";
    /([a-zA-Z]*) und ([a-zA-Z]*)/;
    print "$+\n";
`$.` | `$NR $INPUT_LINE_NR` | Enthält die aktuelle Zeilennummer der zuletzt eingelesenen Datei. Im nebenstehenden Beispiel werden alle Zeilen einer Textdatei eingelesen und ausgegeben. Am Ende kann `$.` darüber Auskunft geben, wie viele Zeilen eingelesen wurden. |
    open(DATEI, "<readme.txt");
    while(<DATEI>)
     { print $_; }
    print $., " Zeilen gelesen";
    close(DATEI);
`$/` | `$RS INPUT_RECORD_SEPARATOR` | Enthält den eingestellten Eingabeseparator. Kann geändert werden - auch mehrere Zeichen sind erlaubt. Das nebenstehende Beispiel bewirkt, dass eine Eingabe von der Standardeingabe erst dann abgeschlossen ist, wenn der Anwender die Zeichenfolge `ENDE` eingibt und `Return` drückt. Der voreingestellte Wert ist das Zeilenumbruch-Zeichen `\n` |
    $/ = "ENDE";

    $DeinName = <STDIN>;

    print $DeinName;
`$\` | `$ORS OUTPUT_RECORD_SEPARATOR` | Erlaubt die Zuweisung einer Zeichenfolge, die automatisch an jede Ausgabe mit print eingefügt wird. |
    $\ = ";";
    print "ein Wert";
`$,` | `$OFS OUTPUT_FIELD_SEPARATOR` | Erlaubt die Zuweisung einer Zeichenfolge, die automatisch an jeden Einzelwert angehängt wird, der mit print in Form mehrerer, durch Kommata getrennter Einzelwerte ausgegeben wird. |
    $, = ",";
    print "Wert","noch einer";
`$"` | `$LIST_SEPARATOR` | Erlaubt die Zuweisung einer Zeichenfolge, die automatisch an jeden Einzelwert außer dem letzten angehängt wird, wenn mit print eine Liste bzw. ein Array innerhalb einer Zeichenkette interpoliert ausgegeben wird. |
    $" = "-";
    @Liste = (1,2,3,4);
    print "@Liste";
`$|` | `$OUTPUT_AUTOFLUSH` | Wenn diese Variable auf einen Wert ungleich `0` gesetzt wird, werden Ausgaben mit `print` nicht gepuffert, sondern erfolgen in dem Augenblick, wo die `print`-Anweisung interpretiert wird. Normalerweise puffert Perl Ausgaben, um sie dann blockweise auszugeben. |
    $| = 1;
`$%` | `$FORMAT_PAGE_NUMBER` | Siehe Funktion format. |
`$=` | `$FORMAT_LINES_PER_PAGE` | Siehe Funktion format. |
`$-` | `$FORMAT_LINES_LEFT` | Siehe Funktion format. |
`$~` | `$FORMAT_NAME` | Siehe Funktion format. |
`$^` | `$FORMAT_TOP_NAME` | Siehe Funktion format. |
`$:` | `$FORMAT_LINE_ BREAK_CHARACTERS` | Siehe Funktion format. |
`$^L` | `$FORMAT_FORMFEED` | Siehe Funktion format. |
`$^A` | `$ACCUMULATOR` | Siehe Funktion format. |

### Vordefinierte Skalare für Umgebungsinformationen

Kurzform | Langform | Bedeutung | Kleines Beispiel
--- | --- | --- | ---
`$?` | `$CHILD_ERROR` | Enthält den Status, der zuletzt von einem system-Aufruf, einer geschlossenen Pipe oder durch Backticks von einem Kindprozess erzeugt wurde. |
    system($command) == 0
      or die "Fehler bei system: $?"
`$!` | `$ERRNO $OS_ERROR` | Enthält eine im aktuellen Programm-Kontext aktuelle Fehlermeldung oder Fehlernummer, sofern ein Fehler aufgetreten ist. Die nebenstehende Anweisung versucht eine Datei zu öffnen und gibt im Fehlerfall die vordefinierte Perl-Fehlermeldung aus, wenn die Datei nicht geöffnet werden kann und beendet das Programm. |
    open(DATEI, "<nixda.txt")
      or die "Fehler bei open: $!";
`$@` | `$EVAL_ERROR` | Enthält einen Wert ungleich `null`, sofern ein Fehler bei einer Anwendung von eval aufgetreten ist. Wenn kein Fehler aufgetreten ist, enthält sie nichts. |
    eval { system("dir"); };
    if($@) {
     print "dir nicht möglich\n";
    }
`$$` | `$PID $PROCESS_ID` | Enthält die Prozess-ID des aktuellen Prozesses, in dem das Script läuft, so wie er vom Betriebssystem zugewiesen wurde. |
    print $$;
`$<` | `$UID REAL_USER_ID` | Enthält die reale User-ID des den aktuellen Prozess ausführenden Benutzers (sofern das Betriebssystem, auf dem der Perl-Interpreter übersetzt wurde, das unterstützt). |
    print $<;
`$>` | `$EID EFFECTIVE_USER_ID` | Enthält die effektive User-ID des den aktuellen Prozess ausführenden Benutzers (sofern das Betriebssystem, auf dem der Perl-Interpreter übersetzt wurde, das unterstützt). |
    print $>;
`$(` | `$GID REAL_GROUP_ID` | Enthält die reale Gruppen-ID des den aktuellen Prozess ausführenden Benutzers (sofern das Betriebssystem, auf dem der Perl-Interpreter übersetzt wurde, das unterstützt). Ist der Benutzer Mitglied in mehreren Gruppen, so enthält diese Variable die einzelnen Gruppen-IDs durch Leerzeichen voneinander getrennt. |
    print $(;
`$)` | `$EGID EFFECTIVE_GROUP_ID` | Enthält die effektive Gruppen-ID des den aktuellen Prozess ausführenden Benutzers (sofern das Betriebssystem, auf dem der Perl-Interpreter übersetzt wurde, das unterstützt). Ist der Benutzer Mitglied in mehreren Gruppen, so enthält diese Variable die einzelnen Gruppen-IDs durch Leerzeichen voneinander getrennt. |
    print $);
`$0` | `$PROGRAM_NAME` | Enthält den Namen des laufenden Scripts. |
    print $0;
`$]` |  | Enthält die genaue Versionsnummer des ausführenden Perl-Interpreters. Diese Variable sollte nicht mehr verwendet werden. Stattdessen wird zu `$^V` geraten. |
    print $];
`$^D` | `$DEBUGGING` | Enthält den aktuellen Wert der Debugging-Flags (Ergebnis der Perl-Aufrufoption `-D`). |
    print $^D;
`$^F` | `$SYSTEM_FD_MAX` | Enthält den Wert des höchsten offenen Dateidescriptors - normalerweise den Wert `2`. |
    print $^F;
`$^H` | `` | Enthält die Anzahl von Syntaxprüfungen, die Perl bei der Angabe von `use strict;` und anderen Angaben zu strenger Syntaxprüfung durchführt. |
    print $^H;
`$^I` | `$INPLACE_EDIT` | ist `defined` oder `undef`, je nachdem, ob das Inplace-Edit-Flag gesetzt ist oder nicht. |
    print $^I;
`$^M` | `` | Kann Daten aufnehmen für den Fall, dass Perl die Ausführung des Scripts wegen Arbeitsspeichermangel nicht fortführen kann. Die nebenstehende Anweisung reserviert 64 Kilobyte Arbeitsspeicher für den Fall, dass Perl bei der Ausführung des Scripts keinen neuen Arbeitsspeicher mehr für benötigte Daten reservieren kann. Dieses Feature muss bei der Übersetzung des Perl-Interpreters explizit aktiviert werden, damit es benutzbar ist. |
    $^M = 'a' x (1<<16);
`$^O` | `$OSNAME` | Name des Betriebssystems. |
    print $^O;
`$^P` | `$PERLDB` | Enthält den aktuellen Debug-Status. |
    print $^P;
`$^S` | `` | Enthält den aktuellen Zustand des Perl-Interpreters. Wenn ein Aufruf von eval nicht beendet ist, hat diese Variable den Wert undef. |
    eval { system("rm_all_old"); };
    print $^S;
`$^T` | `$BASETIME` | Enthält den Zeitpunkt, zu dem das Scipt gestartet wurde. Der Wert entspricht der Zahl an Sekunden, die vom 1.1.1970, 0.00 Uhr, bis zum Startzeitpunkt des Scripts vergangen sind. |
    print "Start: $^T, ";
    sleep(3);
    my $jetzt = time;
    print "und jetzt: $jetzt";
`$^V` | `$PERL_VERSION` | Enthält die genaue Versionsnummer des ausführenden Perl-Interpreters in Form von Ordinalwerten. Um die Daten sichtbar zu machen, verwenden Sie sprintf oder printf und den speziellen Formatbezeichner `%vd`. |
    printf "%vd", $^V;
`$^W` | `$WARNING` | Ist wahr (1), wenn die Perl-Aufrufoption `-w` gesetzt ist, und unwahr (0), wenn sie nicht gesetzt ist. |
    print "Vorsicht!" if($^W);
`$^X` | `$EXECUTABLE_NAME` | Enthält den Namen der ausführbaren Datei des Perl-Interpreters, der das Script ausführt. |
    print $^X;

## Vordefinierte Listen und Hashes

Kurzform | Langform | Bedeutung | Kleines Beispiel
--- | --- | --- | ---
`@_` | `` | Enthält die Parameter, die beim Aufruf einer Subroutine übergeben wurden. Innerhalb der Subroutine sind die übergebenen Parameter mit `$_[0]` (= erster Parameter), `$_[1]` (= zweiter Parameter) usw. ansprechbar. `@_` ist innerhalb von Subroutinen das Standardargument für den Aufruf der Funktion shift. Sie können also den ersten übergebenen Parameter z.B. mit `my $erster = shift;` der Variable `$erster` zuweisen und gleichzeitig aus der Parameterliste entfernen. |
    &Sprich("Hallo Welt");
    sub Sprich {
     print $_[0];
    }
`@ARGV` | `` | Enthält die Parameter, die beim Aufruf des Perl-Scripts mit übergeben wurden. Wenn z.B. `perl test.pl meintext.txt` eingegeben wurde, ist meintext.txt der erste Parameter aus Sicht des Perl-Scripts. Das Script kann Parameter als Input für den Programmablauf auswerten. Im nebenstehenden Beispiel wird der erste übergebene Parameter `$ARGV[0]` als Dateiname interpretiert. Das Script versucht, diese Datei zu öffnen. `@ARGV` ist im globalen Dateikontext das Standardargument für den Aufruf der Funktion `shift`. |
    if (open(DATEI, "< $ARGV[0]")) {
      print "$ARGV[0] geöffnet!";
      close(DATEI);
    }
`@INC` | `` | Enthält die Pfade, in denen Perl nach eingebundenen Modulen sucht. |
    print @INC;
`@ISA` | `` | Enthält eine Liste von Basisklassen, deren Methoden eine Klasse bei objektorientierter Programmierung erben soll. |
    use vars qw(@ISA);
    @ISA = qw(Base);
    print @ISA;
`@EXPORT` | `` | Bei Modulen einsetzbar. Kann Namen des Moduls aufnehmen, die in den Namensraum eines einbindenden Scripts auf jeden Fall exportiert werden. Siehe Erweiterte Verwendung von use. |
    @EXPORT = qw(%FORMULARFELDER);
`@EXPORT_OK` | `` | Bei Modulen einsetzbar. Kann Namen des Moduls aufnehmen, die ein einbindendes Script in den eigenen Namensraum übernehmen kann, aber nicht übernehmen muss. Siehe Erweiterte Verwendung von use. |
    @EXPORT_OK = qw($Zeitstempel @Logdaten);
`%ENV` | `` | Enthält Umgebungsvariablen, die beim Aufruf des Scripts vom aufrufenden System übergeben wurden. Bei CGI-Scripts werden die Umgebungsvariablen vom Webserver gesetzt und sind als CGI-Umgebungsvariablen verfügbar. |
    $, = "\n";
    print keys(%ENV);
`%SIG` | `` | Enthält die zur Verfügung stehenden Signal-Handler, die einem Perl-Script erlauben, auf definierte Signale, die es von anderen laufenden Prozessen erhält, zu reagieren. |
    $, = "\n";
    print keys(%SIG);

| Zeichenketten (Strings)
| Referenzen bzw. Zeiger (Variablen)

© 2005 Impressum