Artikel im Internet unter http://www.hidemail.de/blog/perl-vordefinierte-variablen-systemvariablen.shtml.
Mittwoch, 2.5.2007, 10:15:42 Uhr

Vordefinierte Variablen in Perl


Ich habe ja bereits hier schon mal über vordefiniete Variablen in Perl geschrieben. Es gibt jedoch noch mehr, die ich dann nun hier nochmal beschreiben will. Ich hoffe, ich hab keine weiter vergessen und hab sie nun alle...
$_
Enthält in Schleifen, sofern keine anderere Variable angegeben ist, den jeweils aktuellen Wert.
Das $_ wird von manchen Befehlen in Perl auch als Standartwert verwendet (siehe hier: Befehle, die $_ als Standartwert verwenden).

Enthält bei Operationen mit regulären Ausdrücken den jeweils aktuellen Wert, auf den die RegEx angewemdet wird.

@Zahlen = (1..10);
foreach(@Zahlen) {
print $_, "\n";
}
# RegEx
for (1..3){ if (/1/){ &tuwas; }}




$1, $2
Enthält bei Operationen mit regulären Ausdrücken mit runden Klammern jeweils den Wert eines gemerkten Teilausdrucks.
Übrigens: Die Verwendung dieser Variablen verlangsamt das gesamte Programm, daher wird die Benutzung von Profis nicht empfohlen, wenn es nicht unbedingt sein muß.

$wert="abc":
$wert=~ s/(a)(b)(c)/$1$2$3/;


IN $1 $2 $3 steht zum Schluß a b c.


$&
Enthält bei regulären Ausdrücken den letzten Wert, auf den das vorgegebene Suchmuster passte.
Übrigens: Die Verwendung dieser Variablen verlangsamt das gesamte Programm, daher wird die Benutzung von Profis nicht empfohlen, wenn es nicht unbedingt sein muß.

$_ = "Grün und Blau";
/und/;
print "$&\n";


Ausgabe: und

Übrigens
/und/; bedeutet $_=~ /und/;, wenn man es voll ausschreibt...

$`
Enthält den Teil des regulären Ausdruckes VOR dem letzten Wert, auf den das gegebene Suchmuster passte.
Übrigens: Die Verwendung dieser Variablen verlangsamt das gesamte Programm, daher wird die Benutzung von Profis nicht empfohlen, wenn es nicht unbedingt sein muß.

$_ = "Grün und Blau";
/ und/;
print "$`\n";


Ausgabe:
Grün


$'
Enthält den Teil des Wertes, auf den ein regulärer Ausdruck angewendet wurde, NACH dem letzten Wert, auf den das Suchmuster passte.
Übrigens: Die Verwendung dieser Variablen verlangsamt das gesamte Programm, daher wird die Benutzung von Profis nicht empfohlen, wenn es nicht unbedingt sein muß.

$_ = "Grün und Blau";
/und /;
print "$'\n";


Ausgabe:
Blau


$+
Enthält nach Anwenden eines regulären Ausdrucks mit Klammern den Inhalt der letzten Klammer.
$_ = "Grün und Blau";
/([a-zA-Z]*) und ([a-zA-Z]*)/;
print "$+\n";


$.
Enthält die aktuelle Zeilennummer der zuletzt eingelesenen Datei.

open(DATEI, "<test.txt");
while(<DATEI>)
{ print $_; }
print "Es wurden $. Zeilen eingelesen";
close(DATEI);


Das obige Beispiel öffnet eine Datei, liest alle Zeilen ein, gibt sie aus und gibt zum Schluß die Anzahl der Zeilen aus.


$/
Enthält den eingestellten Eingabeseparator. Voreingestellt ist normalerweise \n, also der Zeilenumbruch, dieser Wert kann aber geändert werden, es sind auch mehrere Zeichen erlaubt. Dieser Wert wird sowohl für Tastatureingaben als auch für "Eingaben" über eine Datei, also beim Einlesen von Dateien, verwendet.


$merker=$/;
$/ = undef;
open(DATEI, "<test.txt");
while(<DATEI>){$dateiinhalt=$_;}
close DATEI;
$/=$merker;


Liest den Innhalt der Datei test.txt auf einen Rutsch ein.

Ein anderes schönes Beispiel ist auch das Folgende

open (FILEHANDLE,"<test.txt");
my $string = do { local $/; <FILEHANDLE> };
close FILEHANDLE;


Hier wird das gleiche Prinzip verfolgt, nur etwas kompakter formuliert.


$\
Erlaubt die Zuweisung einer Zeichenfolge, die automatisch an jede Ausgabe mit print eingefügt wird.

$\ = ";";
print "ein Wert";




$,
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";




$"
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";




$|
$| ist der "Schalter", der dafür zuständig ist, ob Perl seine Ausgaben puffert oder nicht. Alle Werte != 0 deaktivieren die Pufferung, d.h. alle Ausgaben werden sofort ausgegeben. Standartmäßig ist der Puffer aktiviert.

$| = 1;




$?
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: $?"


$!
Enthält eine aktuelle Fehlermeldung oder Fehlernummer, wenn ein Fehler aufgetreten ist.

open(DATEI, "<diedateigibtsnicht.txt") or die "Hülfe, kann Datei nicht oeffnen: $!";




$@
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.
$@ist ganz nützlich, wenn man Module verwenden will, die möglicherweise nicht vorhanden sind.

eval "use Modul;";
if($@) {
print "Das Modul kann nicht geladen werden\n";
}


Warum dies? Ganz einfach: Wenn man ein Modul einfach so verwendet, ohne zu prüfen, ob es installiert ist, wird ein Script sofort mit einer Fehlermeldung abgebrochen.
Mit einem Aufruf von eval und der prüfung von $@ danach kann ein Fehler abgefangen werden und darauf reagiert werden.


$$
Enthält die Porzeß-ID des aktuellen Prozesses, in dem das Script läuft.

print $$;




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





$>
Enthält die effektive User-ID des den aktuellen Prozess ausführenden Benutzers


$(
Enthält die reale Gruppen-ID des den aktuellen Prozess ausführenden Benutzers


$)
Enthält die effektive Gruppen-ID des den aktuellen Prozess ausführenden Benutzers


$0
Enthält den Namen des laufenden Scripts.

print $0;




$]
Enthält die genaue Versionsnummer des ausführenden Perl-Interpreters.


$^D
Enthält den aktuellen Wert der Debugging-Flags (Ergebnis der Perl-Aufrufoption -D).


$^F
Enthält den Wert des höchsten offenen Dateidescriptors - normalerweise den Wert 2.


$^H
Enhtält die Anzahl von Syntaxprüfungen, die Perl bei der Angabe von use strict; und anderen Angaben zu strenger Syntaxprüfung durchführt.


$^I
ist defined oder undef, je nachdem, ob das Inplace-Edit-Flag gesetzt ist oder nicht.


$^M
Kann Daten aufnehmen für den Fall, dass Perl die Ausführung des Scripts wegen Arbeitsspeichermangel
nicht fortführen kann.


$^O
Name des Betriebssystems.


$^P
Enthält den aktuellen Debug-Status.



$^S
Enthält den aktuellen Zustand des Perl-Interpreters. Wenn ein Aufruf von eval nicht beendet ist, hat diese Variable den Wert undef.


$^T
Enthält den Zeitpunkt, zu dem das Scipt gestartet wurde in Epochen, also Sekunden seit 1.1.1970, 0 Uhr.

print "Startzeit war : $^T, ";
sleep(3);
print " jetzt ist es".time;




$^W
Ist wahr (1), wenn die Perl-Aufrufoption -w gesetzt ist, und unwahr (0), wenn sie nicht gesetzt ist.


$^X
Enthält den Namen der ausführbaren Datei des Perl-Interpreters, der das Script ausführt.



@_
Enthält alle Parameter, die beim Aufruf einer Subroutine an diese übergeben wurden.
In dieser Subroutine können die Parameter dann per
$_[0] (= erster Parameter), $_[1] (= zweiter Parameter)
oder
shift (alle Werte nacheinander)
weiterverarbeiten



@ARGV
Enthält die Parameter, die beim Aufruf des Perl-Scripts mit übergeben wurden.
Starttet man zum Beispiel ein Script mit
perl testscript.pl test.txt,
so ist der erste Parameter in @ARGV test.txt

@ARGV ist im globalen Dateikontext das Standardargument für den Aufruf der Funktion shift, die Parameter können also auch per shift eingelesen werden.

$parameter1=shift;
$parameter2=shift;
$parameter3=shift;
print "Der erste übergebene Parameter war $parameter1,\n";
print "Der zweite übergebene Parameter war $parameter2,\n";
print "Der dritte übergebene Parameter war $parameter3,\n";





@INC
Enthält alle Pfade, in denen der Perl-Interpreter nach Modulen sucht, wenn sie eingebunden werden.



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

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

@EXPORT_OK = qw($Zeitstempel @Logdaten);





%ENV
Enthält Umgebungsvariablen, die beim Aufruf des Scriptes vom aufrufenden System übergeben wurden. Bei CGI-Scripten werden die Umgebungsvariablen vom Webserver gesetzt und sind als CGI-Umgebungsvariablen verfügbar.

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


Gibt alle Werte und Inhalte von %ENV aus.


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





Artikel im Internet unter http://www.hidemail.de/blog/perl-vordefinierte-variablen-systemvariablen.shtml.