/blog/perl


substr() in Perl
[153475 mal gelesen]
foreach in Perl
[128979 mal gelesen]
Arrays in Perl - Besonderheiten
[125047 mal gelesen]
split() in Perl - Zeichenketten teilen
[113183 mal gelesen]
open() - Dateien öffnen in Perl
[108804 mal gelesen]
grep - Listen durchsuchen in Perl
[94455 mal gelesen]
chomp() in Perl
[93464 mal gelesen]
push in Perl
[90638 mal gelesen]
sleep in Perl - Das aktuelle Script warten lassen
[75791 mal gelesen]
index() in Perl - Zeichenkette in Zeichenkette suchen
[59233 mal gelesen]


Arrays
Dateien
HTPC
Hashes
Leistungsoptimiert
PHP
Perl
RegEx
Schleifen
Script
Skalare
Sonstiges
System
Webserver
Zur Startseite


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







Kommentare zum Beitrag "Vordefinierte Variablen in Perl"

Kommentar von Renée Bäcker
Ein paar Anmerkungen zu den Spezialvariablen habe ich da noch:

Mit $_ sollte man etwas aufpassen. Bei for-Schleifen ist es unproblematisch, aber while-Schleifen verändern den Wert von $_ :

$_ = 'hallo';
print;

open my $fh,'<','test.txt' or die $!;
while(<$fh>){ };
close $fh;
print $_;

Ausgabe:

C:\>perl test.pl
hallo


Wie man sieht wird nur einmal 'hallo' ausgegeben. Nach der while-Schleife existiert der Wert 'hallo' für die Spezialvariable nicht mehr!

Zu $' und $` sollte man sagen, dass die Verwendung dieser Variablen *alle* Regulären Ausdrücken verlangsamt. Man sollte eher die Klammerung verwenden...

Kommentar von tk
Es heißt Standar_d_werte nicht Standar_t_werte.

Gruß

Kommentar von Sven
Eine schöne Liste.
-Dankeschön-

Kommentar von Mothman
Mir sind seit heute noch folgende Spezialvariablen bekannt, die hier nicht aufgeführt sind:

@- und @+:
speichern die Start- und Endpositionen eines RegEx Treffers:



my $string = "das ist mein Teststring";
$string =~ m/(ist)\s*(mein)/;

print $-[0].' - '.$+[0].'\n';
print $-[1].' - '.$+[1].'\n';
print $-[2].' - '.$+[2].'\n';



Ausgabe:
4 - 15
4 - 7
11 - 15

Erklaerung:
$-[0] enthaelt die Anfangsposition des gesamten RegEx-Treffers
$+[0] enthaelt die Endposition des gesamten RegEx-Treffers
$-[N], $+[N] enthalten Anfangs-/Endposition des Treffers des jeweiligen Klammerausdrucks ($1 ... $9)
N -> 1..9

Kommentar von Mothman
Im obigen Kommentar sollten in der Zeile


my $string = "das ist mein Teststring";

zwischen "ist" und "mein" insgesamt 4 Leerzeichen sein, falls sich jemand ueber die Positionen wundert.


Test:

my $string = "das ist    mein Teststring";



Thema: Perl System

Der Beitrag "Vordefinierte Variablen in Perl" wurde 12409 mal gelesen.

Es wurde 5 x über diesen Beitrag abgestimmt.
Die durchschnittliche Beurteilung liegt bei
1.8 (1 = sehr gut - 6 = grottenschlecht).

Kommentar schreiben  Druckansicht  Seitenanfang 
Beurteilen 






 Zufällige Beiträge im /blog/perl

until in Perl

Ganze Verzeichnisse sperren für andere Anwendungen - Flock für Verzeichnisse

redo - Schleife erneut durchlaufen

Arrayeinträge zählen und sortiert nach Häufigkeit ausgeben

die - Perl-Script wegen eines Fehlers abbrechen

Befehle, die standartmäßig $_ verwenden, und solche, die das nicht tun

Kuriose Reguläre Ausdrücke

Client - Server - Beispiel mit IO::Socket

delete () - Ein Elementenpaar aus Hash löschen in Perl

Dateitestoperatoren - Eigenschaften von Verzeichnissen und Dateien feststellen



0.0248830318450928 sec. to build



...Blogsoftware in pure Perl - Powered by a lot of Coffee...


SSD-Festplatte - Wassn das???
Die Transliteration - Nur ein Zeichen in einem Skalar ersetzen
Select - Case in Perl
Windows 7 XP Mode – Wo finde ich den XP-Modus unter Windows 7?
Mac-Adresse beim Apple Macintosh herausfinden
SGN-Funktion für Perl

Eigene IP herausfinden mit Perl
Epoche live in Datum umwandeln
Firefox 3 - Exe-Files downloaden


Gesamtverzeichnis
Februar 2010
Dezember 2009
Oktober 2009
Januar 2009
Dezember 2008
November 2008
September 2008
August 2008
Juli 2008
Juni 2008
Mai 2008
April 2008
Januar 2008
Dezember 2007
November 2007
Oktober 2007
September 2007
August 2007
Juni 2007
Mai 2007
April 2007
März 2007
Februar 2007
Januar 2007
Dezember 2006


Mister Wong

RSS-Feed

Heute ist der
27.7.2024

Es ist
5:19:03 Uhr

Ihre IP:
3.145.7.245

Blog-Einträge: 186

Die letzten 24 Stunden im Überblick


Gelesene Beiträge insgesamt:
4406738


Webseiten vergleichen
Kalender mit Feiertagen - 2028
Links finden und testen
Menschliche Datumsangaben
IP zu Domain herausfinden
Time live in Datum umwandeln
Perl für Windows



Impressum