Perl-Programmierung: Vordefinierte Variablen

Aus Wikibooks


Vordefinierte Variablen[Bearbeiten]

Perl bietet eine Reihe von vordefinierten Variablen, die vom Perl-Interpreter automatisch deklariert werden. In den Variablen werden Informationen über die Laufzeitumgebung und das Perl-Skript gespeichert.

Verschiedene Skalarvariablen[Bearbeiten]

Um die alternativen Variablennamen nutzen zu können, muss das Modul English importiert werden:

use English;


$^O Hier wird das Betriebssystem angegeben (alternativ: $OSNAME)
$^T Gibt - in Unix-Zeitrechnung - den Zeitpunkt, zu dem das Programm gestartet wurde, an (alternativ: $BASETIME)
$^W Ob der Perl-Interpreter mit der Option -w gestartet wurde (alternativ: $WARNING)
$0 Name des Skripts (alternativ: $PROGRAM_NAME)
$< Gibt an, unter welcher BenutzerInnen-Kennung (User-ID) das Skript gestartet wurde (alternativ: $UID)
$( Die Gruppenkennung (Group-ID), unter das Skript ausgeführt wird (alternativ: $GID)
$$ Die Prozess-ID des Programms (alternativ: $PID)

$UID und $GID funktionieren nicht unter Windows!

Umgebungs-Variablen[Bearbeiten]

Über den Hash %ENV kann auf die Umgebungsvariablen (environment) eines Betriebssystems zugegriffen werden Aufruf:

foreach (keys(%ENV)){
    print $_ . ": " . $ENV{$_} . "\n";
}

Mögliche Ausgabe unter Windows:

USERPROFILE: C:\Dokumente und Einstellungen\Test 
HOMEDRIVE: C:
TEMP: C:\DOKUME~1\TEST~1\LOKALE~1\Temp
SYSTEMDRIVE: C:
PROCESSOR_REVISION: 2302
SYSTEMROOT: C:\WINDOWS
COMMONPROGRAMFILES: C:\Programme\Gemeinsame Dateien
COMSPEC: C:\WINDOWS\system32\cmd.exe
SESSIONNAME: Console
LOGONSERVER: \\NEO
OSTYPE: cygwin32
APPDATA: C:\Dokumente und Einstellungen\Test\Anwendungsdaten
WINDIR: C:\WINDOWS
PROGRAMFILES: C:\Programme
OS: Windows_NT
CYGNUS_HOME: C:\Programme\cygwin
PROCESSOR_LEVEL: 15
PATHEXT: .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
USERNAME: Test
PROMPT: $P$G
NUMBER_OF_PROCESSORS: 2
FP_NO_HOST_CHECK: NO
HOMEPATH: \Dokumente und Einstellungen\Test
PROCESSOR_IDENTIFIER: x86 Family 15 Model 35 Stepping 2, AuthenticAMD
PATH: C:\Programme\cygwin\bin;C:\Perl\site\bin;C:\Perl\bin;C:\WINDOWS\system32; C:\WINDOWS;C:\WINDOWS\System32\Wbem;;C:\PROGRA~1\GEMEIN~1\MUVEET~1\030625
USERDOMAIN: NEO
GPC_EXEC_PREFIX: C:\Programme\cygwin/lib/gcc-lib/
COMPUTERNAME: NEO
ALLUSERSPROFILE: C:\Dokumente und Einstellungen\All Users
PROCESSOR_ARCHITECTURE: x86
TMP: C:\DOKUME~1\TEST~1\LOKALE~1\Temp

Kommandozeilenparameter[Bearbeiten]

In der Listenvariablen @ARGV werden die Kommandozeilenparameter, die beim Aufruf angegeben wurden, gespeichert.
Aufruf:

perl beispiel.p -h

Anwendung:

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

my $arg = shift @ARGV;
if ( ! defined $arg ) {
    print "Es wurde kein Argument übergeben.\n";
}
elsif ($arg eq '-h') {
   print "Leider ist noch keine Hilfe verfügbar.\n";
}
else {
   print "Der Parameter '$arg' ist nicht bekannt.\n";
}

Es gibt auf CPAN mehrere Module die @ARGV auswerten. Am weitesten verbreitet ist das Module Getopt::Long.

Funktionsvariablen[Bearbeiten]

Die beim Aufruf einer Funktion mitgegebenen Variablen werden in der Liste @_ gespeichert. Diese ähnelt in der Verwendung der oben beschriebenen @ARGV, welche an das Hauptprogramm mitgegebene Werte enthält

Beispiel

sub Addition{
   my $zahl1 = shift(@_);
   my $zahl2 = shift(@_);
   print "Die Summe ist" . ($zahl1 + $zahl2);
}

Fehlermeldungen[Bearbeiten]

Die Variable $! wird benutzt, wenn eine Systemfunktion einen Fehler verursacht hat. $! enthält in diesem Fall die Fehlermeldung, die dem Perl-Programm zurückgegeben wurde

open(IN,"<nix.txt") or print $!;

Module[Bearbeiten]

Im Array @INC ist der aktuelle Suchpfad für Module abgelegt. Im Hash %INC sind die aktuell geladenen Module abrufbar.

$_[Bearbeiten]

Die Variable $_ wurde bereits im Kapitel Spezialvariablen von Perl ausführlich besprochen. Jedesmal, wenn bei Funktionen oder Schleifen keine Variablen angegeben werden, speichert der Interpreter die jeweiligen Werte in $_. Mithilfe von $_ lässt sich sehr kurzer, allerdings auch sehr unleserlicher Programmcode produzieren!

open $IN, "< text.txt" or die "Fehler: $!";
while(<$IN>){
    print;
}

Dieses Programm liest eine Datei ein und gibt ihren Inhalt zeilenweise aus.
Eine leserlichere Version desselben Programms wäre:

open $IN, "< text.txt" or die "Error: $!";
while(my $input = <$IN>){
    print $input;
}