Perl-Programmierung: Vordefinierte Variablen
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;
}