Operatoren:
Beispiel: | Erklärung: |
print 1 + 1; | Addition |
print 3 - 2; | Subtraktion |
print 2 * 2; | Multiplikation |
print 1 / 2; | Division |
print 3 % 2; | Modulo |
print 2 ** 3; | Exponent |
print 2 < 3; | ? kleiner als |
print 2 <= 3; | ? kleiner gleich |
print 2 > 3; | ? größer als |
print 2 == 3; | Zahlenvergleich |
print 2 != 3; | nicht(Zahlenvergleich) |
print 2 <= 3 && 3<=4; | && = logische Undverknüpfung |
print 4 << 2; | Bitverschiebung links |
print 4 >> 2; | Bitverschiebung rechts |
print 4 & 0x01; | bitweises Und |
print 4 | 0x01; | bitweises Oder |
print 4 ^ 0x01; | Bit-Exclusiv-ODER |
$c = $a > $b ? $a : $b; | Ternärer Vergleichsoperator |
$test++; | Increment |
$test--; | Decrement |
print "Hallo" . "Welt" . "\n"; | Stringzusammenfügen |
print "Hallo" x 2; | Stringwiederholung |
$_ =~ /Muster/; | String passt |
$_ !~ /Muster/; | String passt nicht |
print "Harry" eq "Herbert"; | [eq lt gt ge] Vergleichsoperatoren für Strings (Scalare) |
print "Harry" cmp "Otto"; | noch ein Vergleichsoperator |
print ~34; | Bitkomplement |
$test
= 3; # Scalar anlegen
$test2 = "Hallo ich bin ein Skalar " . $test; #neuen
scalar anlegen und einen dranfügen.
print ("in Skalar test2 steht: $test2 drin"); # ausgabe
print ('in Skalar $test2 steht ',$test2,'
drinn'); # in '' stehende Strings werden nicht
# ausgewertet.
Referenzen:
$testref = \$test;
# eine Referenz von $test wird in $testref angelegt
$deref = $$testref; # in deref steht wieder der Inhalt von $test...
$deref = ${$testref}; # dasselbe
Weitere Funktionen mit Strings:
if (defined $a)
{ print ("Ja - ist definiert") }; # no comment...
chop($test); # das letzte Zeichen aus $test wird herausgeschnitten
und zurückgeliefert
chomp($test); # das abschliessende Newline-Zeichen wird entfernt
# und ggf. die Anzahl der abgeschnittenen Zeichen zurückgeliefert
$length = length($test); # no comment
$partstr = substr($string,$offset,$length); # $partstring ist der
teil des $string, der ab
# $offset anfängt und die Länge $length hat...
Besondere Scalare:
$_ | "default" Scalar |
$~ | Format-Scalar |
$| | !=0 : jedes Zeichen wird sofort ausgegeben; sonst nur bei \n |
\n | Neue Zeile |
\r | <ENTER> - Taste |
\t | Tabulatorschritt |
\f | Seitenvorschub |
\b | <delete> - Taste |
\v | Zeilenvorschub |
\a | Alarm |
\e | <Esc>-Taste |
\0x | Oktal-Wert in x |
\Xx | Hexadezimalwert in x |
\cx | <STRG>+<X> |
\\ | das - \ - Zeichen |
\l | das nächste Zeichen in Kleinschreibung |
\L | Alle Zeichen bis zum nächsten \E in Kleinschreibung |
\u | Das nächste Zeichen in Grosschreibung |
\U | Alles Zeichen als Grossbuchstaben bis zum nächsten \E |
\E | begrenzt \L und \U |
Listen und Strings:
Besondere Listen:
$ARGV | Parameter die dem Script übergeben wurden |
$string = join("\n",
@list); #die Einträge in @list werden durch "\n" - getrennt
# in $string übergeben...
Mehrdimensionale Listen:
$field[4][7] = 13; # Zweidimensionales Feld
$space[2][3][1] = "Wert"; # Dreidimensionales Feld
Funktionen mit Listen:
push (@alist, $scalar); # fügt $scalar ans Ende der Liste ein
$element = pop (@alist); # entfernt das letzte Element der Liste
und liefert es zurück
unshift(@alist,$scalar); # fügt $scalar an den Anfagn der Liste
ein
$element = shift(@alist); # entfernt das erste Element der Liste
und liefert es zurück
splice(@alist,$offset,$length,@insertlist); # ersetze die Teilliste
von @alist, die
# beim $offset beginnt und $length Elemente
# lang ist, durch die Liste @insertlist
grep { Funktionsblock } @list; # Evalutiert den Funktionsblock
für
# jedes Listenelement und reiht es
# in die Ergebnissliste ein, falls
# der Rückgabewert wahr ist
grep EXPR, @list ; # Wie oben, nur evaluiert der
Aufruf
# den ausdruck EXPR
map { Funktionsblock } @ list; # Evaluiert den
Funktionsblock für
# jedes Listenelement und steckt den Rückgabewert
# in die Ergebnisliste
map EXPR, @list; # Wie oben nur mit EXPR
(Anmerkung: Es funktioniert auch Pattern Matching. @part=grep /e/, @list; )
Referenzen:
$arrayref = \@array; # referenz eines Arrays
@array = @$arrayref; # ursprungsarray
@array = @{$arrayref}; # oder so..
$element = ${$arrayref}[2]; # element aus einer referenz
$element = $arrayref->[2]; # oder so..
$value = $myhash{"name"}; # Hashes verknüpfen
Scalare mit anderen Scalaren. Hier
# wird der wert zurückgegeben mit dem "name"
# verknüpft wurde
$myhash{"name"}="Christopher"; # hier wird "name" ->
"Christopher" zugewiesen
%myhash ist
der Bezeichner von dem Hash
mit keys
%myhash extrahiert man sämtliche Keys des Hashes
mit values alle Werte... (siehe Schleifen..)
if (exists($myhash{"name"})) { ... } # stellt fest
ob der Key existiert...
delete($myhash{"name"}); # löscht den Key - "name"
...
%hash = ("key1" => "val1", "key2" => "val2", ...); # Initialisiert
einen Hash
print "Hashinalt: @{[%hash]} \n"; # gibt den hashinhalt durch Leerzeichen
# getrennt aus..
Referenzen:
$hashref = \%hash; # Hash -> Hashreferenz
%hash = %$hashref; # Hashreferenz -> Hash
%hash = %{$hashref}; # dasselbe
$value = ${$hashref}{"key"}; # Hashreferenz -> value
$value = $hashref->{"key"}; # dasselbe
if ($a =~ /p/) { ... } # die wohl typischte Bedingung mit einem Pattern
(p)
if ($a ==42 ) { ... } elsif ($a <42) { .. } else { .. } # jeder dann
ausgeführte Code muss in geschweifte Klammern
$a =~ /p/ && do { .. }; # if fuer ein regular Pattern...
$max = $a > $b ? $a : $b; # $max = maximum($a, $b);
print "$file ist keine Datei\n" unless -f $file;
Schleifenkontrolle:
innerhalb der Schleife stehende Ausdrücke..
next; # mache sofort mit der nächsten "Runde" weiter...
last; # breche jetzt ab und erkläre die Schleife für
beendet
redo; # mache diesen Schleifendurchlauf nochmal
Schleifen über Hashes:
foreach $key (keys %testhatch) { ... } # über
Keys interieren
while (($key, $value) = each %testhash) { .. } #
das gleiche nur als Paar
[1, "zwei", 3] # erzeugt anonyme Liste
{ "key1" => "value1", "key2" => "value2" } # anonymer Hast
@{[func()]} # ein Cast des Ergebnisses der Funktion zu Liste
$funcref = sub { ... }; # anonyme funktion
$scalaref = \42; # "anonymer scalar"...
@{...} ist also ein Listencast...
$string =~ /PATTERN/; #liefert true wenn PATTERN in $string vorkommt
if ($string =~ /Bill/) {
print "Bill in string!\n";
}
Sonderzeichen im Pattern:
\s \S | Whitespace (Leerzeichen) / Kein Whitespace |
\w \W | Alphanumerisches Zeichen /Nicht alphanumerisch |
\d \D | Ziffer / Keine Ziffer |
\b \B | Wortgrenze / Keine Wortgrenze |
[1234] [1-4] | Menge als Aufzählung / Bereich |
[^567] [^5-7] | Ausgeschlossene Mengen |
. | Beliebiges Zeichen (außer Newline) |
Quantifikatoren für vorhergehendes Pattern: | |
* | Keinmal oder beliebig oft |
? | Keinmal oder einmal |
+ | Einmal oder beliebig oft |
{m} | Genau m-mal |
{m,} | Mindestens m-mal |
{m,n} | m-mal bis n-mal |
\1, \2, ... | Rückwärtsreferenz |
(...) | Gruppierung |
(?:...) | Gruppierung ohne Rückwärtsreferenz |
^ | Zeilenanfang |
$ | Zeilenende |
a|b|c | Alternativen |
*? +? ?? {...}? | Non-greedy-Operator (Minimalmatch) |
(?=...) (?!...) | Lock-Ahead positiv/negativ |
$string = 'Dollar($) Backslash (\)';
print quotemeta($string);
Besondere Modifikatoren
für reguläre Ausdrücke:
Nach dem abschliessenden / in einem regulären Ausdruck können noch
(ein oder mehrere) Modifikatoren stehen:
/.../m | Multiline - Wenn der String mehrere Zeilenumbrüche enthält wird jede Zeile separat von der Suche behandelt bis sie Erfolg hat. |
/.../o | Jede Variable wird nur ein mal interpretiert - eventuell aus diesem Inhalt entstehende weiteren Variablen werden nicht behandelt |
/.../s | Singleline - Der Suchstring wird als Einzeiler interpretiert |
/.../i | Gross/Kleinschreibung ignorieren |
Ergebnissvariablen
nach erfolgreichem Pattern-vergleich:
$' oder $POSTMATCH | Enthält alles des Strings was nach dem Match lag (super interessant für rekursive Suchen) |
$& oder $MATCH | Enthält den Stringteil der zum erfolgreichen Match führte |
$` oder $PREMATCH | Enthält alles des Strings was vor dem Match lag |
$<Ziffer> also $1 oder $2 oder ... | Enthält die
gefundenen Teile die beim Pattern-vergleich in Klammern standen. |
Suchen und Ersetzen:
$test =~ s/suche/ersetze/g;
s/^([^ ]*) *([^ ]*)/$2 $1/; # vertauscht die ersten beiden Wörter
Die Werte der übergebenen
Parameter stehen in dem Array @_
und
können am cleversten mit my $var1 = shift;
geholt werden.
return xx;
gibt
einen Wert zurück, ansonsten wird der Wert genommen, der zum Schluss in
$_
oder @_
stand.
der my - Operator begrenzt den Gültigkeitsbereich
einer Variablen lokal.
@mylist = @{[func()]}; # erzwingt Array-Kontext für Funktion func();
Referenzen:
$funcref = \&func; # Function -> Funktionsreferenz
&$funcref; # Funktionsreferenz -> Aufruf
&$funcref(); # dasselbe
Tests:
open (FILE, ">file") || die("Cannot open $file!"); # test...
Datei Operatoren:
-r -R | Effektive/Reale UID+GID hat Leserechte |
-w -W | Effektive/Reale UID+GID hat Schreibrechte |
-x -X | Effektive/Reale UID+GID hat Ausführungsrechte |
-o -O | Effektive/Reale UID+GID ist Eigentümer |
-e -z | Existiert / hat Größe Null |
-s | Größer als 0 Bytes (gibt Größe zurück) |
-f -d -l | Typ: Datei / Verzeichnis / Symbolischer Link |
-S -p | Socket / Named Pipe |
-b -c | Block / char Device |
-u -g -k | Setuid / Setgid / Sticky-Bit gesetzt |
-t | Ist ein tty |
-T -B | Text / Binärdatei |
-M -C | Gibt Tage seit der letzten Modifikation / Rechteänderung zurück |
- STDIN, STDOUT,
STDERR # Standardhandles
- <> # STDIN oder Dateien auf der Kommandozeile
while (<INFH>) { print $_; } # oder
@infh = <INFH>; while (@infh) { print $_; }
Pipes:
open (LS, "/bin/ls |"; # Pipe lesend öffnen
open (PRINTOUT,"| /bin/lp"); # Pipe schreibend öffnen
open (PRG,"programm 2>&1 |"); # Veranlasst
# zumindestens unter Linux STDERR und
STDOUT zusammengefasst
# zu lesen....
Ausgabe:
print INFH "Text\n";
Directorys:
opendir(DIR,"/usr/bin");
@entries = readdir(DIR);
closedir(DIR);
package test; # definiert den nächsten Teil als Package namens "test"
use Test; # includiert Test...
package Packet_mit_Klassen;
sub new {
bless{}; # baut einen neuen Namensraum für
ein neues Objekt
}
sub eine_funktion {
my self$ = shift; # es ist so Konvention, das
als Parameter der eigene Namens-
# raum mitgeliefert wir
... # tuwas
}
package main;
use Packet_mit_Klassen;
$objref = Packet_mit_Klassen->new();
$objref = Packet_mit_Klassen->eine_funktion(); # die Funktion
dieser Klasse wird
# angesprungen...
2. Umgang mit der Zeit
$zeit = time(); #zeit in secs
$zeit2 = scalar localtime(); #echte zeit
Dadurch wird einmal
die Zeit in Sekunden (zum Rechnen) angegeben, einmal mit Wochenangabe
und formatiert...
Kommandos des Terminals:
Kommando: | Bedeutung: |
T | Stack beobachten |
s | Einzelschritt |
n | Nächster Schritt, übergeht Subroutinenaufrufe |
r | Rückkehr von der aktuellen Subroutine |
c [line] | Fortführung; optionales Einsetzen eines Einmal-Stoppunktes an der gewünschten Zeile |
<CR> | Wiederholt den letzten n- oder s-Befehl |
l min+incr | Listet incr+1 Zeilen, beginnend von min. |
l min-max | Listet Zeilen auf |
l line | Zeigt Zeile an |
l | Zeigt nächste Seite |
- | Zeigt vorhergehende Seite |
w line | Zeigt Seite um die Zeile herum |
l subname | Zeigt Subroutine |
f filename | Wechselt zum Dateinamen. |
/pattern/ | Sucht vorwärts nach Mustern; das abschliessende / ist optional |
?pattern? | Sucht rückwärtz nach Mustern |
L | zeigt Stoppunkte und Aktionen |
S | Listet die namen der Subroutinen auf |
t | Wechselt zum Trace-Modus |
b [line] [condition] | Setzt Stoppunkt; Zeile wird zur aktuellen Ausführungszeile; der Zustand wechselt, wenn er ein Wahr erkennt, Voreinstellung auf 1. |
b subname [condition] | Setzt Stoppunkt an der ersten Zeile einer Subroutine |
d [line] | Löscht Stoppunkt |
D | Löscht alle Stoppunkte |
a [line] command | Setze eine Aktion auf getan, bevor die Zeile ausgeführt wird. Die Filge ist: Prüfung auf Stoppunkt, druckt die Zeile wenn nötig, führt Aktion aus, und teilt dem Benutzer einen Stoppunkt oder Schritt der Zeile mit. |
A | Löscht alle Aktionen |
V [pkg [vars]] | Listet einige (Voreinstellung: alle) Variablen auf (Voreinstellung: aktuelle) |
X [vars] | Dasselbe wie >V currentpackage [vars]<. |
< command | Definieren des Befehls vor der Meldung |
> command | Definieren des Befehls nach der Meldung |
! number | Wiederholung des Befehls (Voreinstellung: vorhergehender Befehl) |
! - number | Wiederholt bestimmte Anzahl letzer Befehle |
H -number | Zeigt letzte Anzahl der Befehle (Voreinstellung: alle) |
q or ^D | Beenden |
p expr | Dasselbe wie >print DB<<OUT expr< im autiellen Paket |
= [alias value] | Definiert einen Befehls-Alias, oder listet alle aktuellen Aliase auf |
command | führt einen Befehl als perl-Statement im aktuellen Packet aus. |
Zeichen | Bedeutung |
< | Linksbündiger Text |
> | Rechtsbündiger Text |
| | Zentrierter Text |
# | Numerisches Feld |
* | Mehrzeiliges Feld |
Zwei Möglichkeiten
zum Benutzen der Formate:
format STDOUT=
....
....
.
write STDOUT;
oder Benutzung
der Variable $~ um
STDOUT oder den mit select()-gewählten Dateihandle ein format zuzuweisen:
format OUT=
....
....
.
[$alt = select(DATEI);]
$~ = "OUT";
[select($alt);]
write;
Der Operator << legt den Terminations-String fest, der einen beginnenden, eventuell mehrzeiligen Text abschließt:
$text = <<BriefEnde;
Lieber Anwender!
Wegen dringender Wartungsarbeiten ist derzeit kein
Zugriff auf den Server $server möglich.
Fröhliches Kopfrechnen! Ihre Systemadministratoren
BriefEnde
Im Beispiel wird $server durch den Variableninhalt ersetzt. Ist dies nicht erwünscht dann...
print <<'TheEnd';
Die Kosten betragen $100.
TheEnd
Das funktioniert übrigends fast beliebig komplex:
Foreach $i (split(/\n/,<<TextEnde)) {
Zeile1
Zeile2
TextEnde
Print "$i\n"; # Zeile ausgeben
}