perl -v
2.2 Skript-Aufbau
Am besten an einem Beispiel:
Anweisung: Bedeutung:
===========================================================================
#!/usr/bin/perl #! und absoluter Pfadname des PERL-Programmes
# Kommentaranweisung beginnen mit Doppelkreuz und gehen bis zum Zeilen-
ende
print "Herzlich PERL-Anweisungen (Werden mit ; abgeschlossen!)
willkommen\n";
$ Skriptname Skript ausführen (An Zugriffsrechte denken!)
sub functname { evtl. Unterprogramme/Funktionen
...
}
3 Drucken
Immer wenn ein Programm (Perl-Skript) gestartet wird sind drei Dateien geöffnet,
nämlich stdin, stdout und stderr. Perl erbt diese von der Shell in einem Dateihandle, es greift
also nicht direkt darauf zu! Die Namen der Handles sind (zur verblüffung aller): STDIN, STDOUT und STDERR.
Es können natürlich auch andere Dateihandles erzeugt werden.
3.1 Wörter
Jedes Wort, das nicht in Hochkommata steht, muß mit Alpha-Zeichen anfangen.
(Weitere Alpha-Zeichen und _ können folgen.)
Perl unterscheidet zwischen Klein- und Großbuchstaben
Hochkommata:
Zeichenketten in ' ' oder " "
'Zeichenkette': Jedes Zeichen wird als Literal behandelt.
"Zeichenkette": Variablenersetzung und Escape-Sequenzen werden gesondert behandelt.
Sonderzeichen (z.B. $, @, %) müssen "geflüchtet" (\) werden oder
in ' ' stehen.
Literale = Konstanten:
numerische:
12345: ganze Zahl
0xff: hexadezimale Zahl
034: oktale Zahl
1.45: Gleitkommazahl
Zeichenkettenliterale:
in ' ' oder " "
Zeichenketten, die Zeichenkettenliterale oder Escape-Sequenzen enthalten
(durch " " begrenzt - Escape-Sequenzen: \n \t \a ...)
spezielle Literale:
Werden als eigenständige Wörter betrachtet und nicht interpretiert, wenn sie in Hochkommata
stehen:
_LINE_: aktuelle Zeilennummer (im Perl-Skript)
_FILE_: aktueller Dateiname (des Perl-Skriptes)
_END_: logisches Ende des Skript (Rest ignoriert)
3.2 Die Funktion 'print'
Gibt eine Zeichenkette oder durch Komma getrennte Liste von Wörtern auf STDOUT
aus.
(Erfolg Wert 1, sonst 0)
z.B.:
print "Guten","Tag","\n";
Leerzeichen müssen innerhalb " " angegeben werden!
oder:
print STDOUT Guten Tag, "\n";
Zeichenketten nicht in " " - Dateihandle muß angegeben werden!
print "Preis ist $100\n";
$=Sonderzeichen (skalare Var. referiert) $100 gibt es nicht, somit keine Ausgabe!
print "Preis ist \$100\n";
O.K.
print "\tnext\n";
Escape's werden interpretiert.
print '\tnext\n';
Nicht interpretiert - einfach alles so ausgeben.
3.3 Die Funktion 'printf'
Formatierte Ausgabe einer Zeichenkette auf Dateihandle (default STDOUT).
Wie printf in C und awk.
Rückgabewert: 1 = Erfolg, sonst 0.
Syntax: printf ("Formatanweisung",Argumentliste);
in Formatanweisung Formatangaben - z.B. %d
Konvertierungzeichen:
c: Zeichen
d: Dezimalzahl
s: Zeichenkette
...
4 Variablen
4.1 Perl-Variablen
Variablen = Datenobjekte, deren Wert sich im Laufe des Programmes ändern kann
Perl kennt verschiedene Variablentypen:
Skalare: enthält einen einzigen Wert
Felder: Reihe von Werten mit positivem Index
assoziative Felder: als Index Zeichenketten
Sichtbarkeit = global (kann überall benutzt werden)
Variablen haben eigenen Namensraum (durch erstes Zeichen bestimmt):
$: skalare Variable
@: Feldvariable
%: assoziative Feldvariable
gleiche Namen möglich ($abc bzw. @abc)
Unterscheidung zwischen Klein- und Großbuchstaben
Variable beginnt mit Buchstaben ( _ gehört dazu) - kann beliebig lang sein
Variable beginnt nicht mit Buchstaben - darf genau ein Zeichen lang sein ($_ oder $.)
nichtinitialisierte Variable erhält Wert 0 bzw. NULL (leere Zeichenkette)
Zuweisung: Variable = Ausdruck;
z. B.:
$gehalt=10000;
@tage=(montag,dienstag,mittwoch);
%auto=('da','darmstadt', 'gg','groß gerau', 'g','gera',);
print "$gehalt"; - - - 10000
print "@tage"; - - - montag dienstag mittwoch
print "$tage[0]"; - - - montag
print "auto{'g'}"; - - - gera
Hochkommata bestimmen, wie Variablen interpretiert werden (ähnlich Shell)
drei Typen:
einfache
doppelte
accent graves (Gravis)
Backslash (\) wie einfache, aber nur für ein Zeichen
einfache oder doppelt - - - Begrenzung für Zeichenkette (bei doppelt: Sonderzeichen
interpretiert)
Gravis: Kommando ausgeführt
doppelte:
immer paarweise (außer '"' oder \")
skalare Variablen ($...) und Felder (@...) durch ihren Wert ersetzt
\n , \t: in " ", sonst nicht interpretiert
einfache:
so ausgegeben, wie angegeben (jedes Zeichen als Literal behandelt)
Gravis:
z.B.:
print "Datum:",`date`;
Kommando ausgeführt und Ergebnis eingesetzt
alternative Perl-Quotierungen:
q: ersetzt einfaches Hochkommata
qq: doppeltes
qx: ersetzt Gravis
Die zu quotierende Zeichenkette, steht in Schrägstrichen (/ ... /):
z. B.:
print q/ich brache $5/;
4.2 Skalare, Felder und assoziative Felder
4.2.1 Skalare Variablen
beginnen mit $ - enthalten Zahl oder Zeichenkette
es muß immer $ vorangestellt werden ! ($xy=13;)
Zuweisung - rechte Seite zu einem Skalar berechnet ($name="john smith";)
Funktion "defined" - Skalar hat weder gültige Zeichenketten noch gültigen numerischen Wert,
dann nicht definiert:
defined $var1; # Wert 1 gültig (sonst Null)
print "OK \n" if defined $var1;
Funktion "undef" - macht gültige Variable ungültig, Speicher wird freigegeben
Variable "$_" - enthält aktuelle Zeile (default-Suchraum für Mustersuchen) - wie $0 bei awk
4.2.2 Felder
über einen Namen auf Folge von elementen zugreifen (Name plus Index)
Elemente müssen nicht vom gleichen Typ sein (Zahlen und Zeichenketten können gemischt
werden)
Feld beginnt mit @
Indizies in [] mit Null beginnend
Zuweisung: @feld1=(100,"zk1",200,300,"last"); (Klammern notwendig, da Zuweisung höhere
Priorität als Kommaoperator!), z.B.:
@empty=(); #leere Liste
$size=@feld; #Wert des Skalars = Anzahl Feldelemente
spezielle Skalare und Feldzuweisungen:
$#Feldname: letzter Index des Feldes (Länge - 1)
$[: erster Index (gilt global/kein Feldname, normalerweise null, möglichst nicht verwenden!)
Bereichsoperator und Feldzuweisungen:
Bereichsoperator ".." - bei Feldern bekommt man ein Feld von Werten, das beim
linken Wert beginnt und beim rechten endet (um eins hochgezählt)
@ziffern=(0..10); -> Feld ziffern die Ziffern 0 bis 10 zuweisen
@Buchstaben=('a'..'z'); -> Liste Kleinbuchstaben
Zugriff auf Feldelemente:
Elemente sind Skalare und Index beginnt mit 0 ($feld[5])
Teilfelder:
Elementen eines Feldes werden Werte eines anderen zugewiesen: Ergebnisfeld = Teilfeld
Feld rechte Seite: restliche nicht zugewiesen
Feld links: nicht benutzte undefiniert
4.2.3 Assoziative Felder
besteht aus Paaren von Skalaren (Zeichenketten, Zahlen, Boolesche Werte)
erster Wert ist Index (Angabe Index in {} statt [ ]) z. B.:
%Jahreszeiten=(`F','Fruehling','S','Sommer','H','Herbst','W','Winter');
Zugriff auf Elemente:
über Index: umgeben von gescheiften Klammern:
print "Winter->$Jahreszeiten{`W'}";
print "alle->%Jahreszeiten"; #Reihenfolge eventuell anders!
4.3 Lesen von STDIN
drei Dateihandles STDIN, STDOUT und STDERR = Namen für drei vordefinierte Streams
stdin, stdout und stderr (normalerweise mit Terminal verbunden
Perl-Eingabeoperator <> umschließt Parameter STDIN, damit die
nächste Eingabeziel
von der Tastatur gelesen und der Variablen zugewiesen werden kann - am Ende steht
"neue-Zeile-Zeichen" (löschen mit chop)
Zuweisen von Eingaben an skalare Variablen:
print "Bitte Namen eingeben! ";
$name=<STDIN>;
es wird Eingabezeile einschließlich "Neue-Zeile-Zeichen" gelesen
chop-Funktion
entfernt letztes Zeichen in einer Zeichenkette - hauptsächlich verwendet, um NewLine am
Ende einer Eingabezeile zu löschen:
print "Bitte Namen eingeben! ";
chop($name=<STDIN>);
getc-Funktion
liest ein einzelnes Zeichen von der Tastatur oder Datei (EOF: leere Zeichenkette)
Format:
getc (DATEIHANDLE)
getc DATEIHANDLE
getc
print "Klare Antwort (j/n) ";
$antwort=getc;
Zuweisen von Eingaben an Felder
beim Einlesen vom Dateihandle STDIN in ein Feld wird jede Zeile mit dem NewLine-Zeichen
gelesen und als ein Element des Feldes betrachtet (solange bis ^d):
print "Erzaehlen Sie alles ueber sich";
@all=<STDIN>;
print "@ll\n";
Zuweisen von Eingaben an assoziative Felder
$course_number=101;
print "Name fuer Kurs 101?";
$course{$course_number}=<STDIN>;
4.4 Feldfunktionen
Felder können wachsen und schrumpfen (Perl erlaubt Elemente am Anfang, in der Mitte oder am
Ende einzufügen oder zu löschen)
Funktion 'chop' (mit Feldern)
entfernt letztes Zeichen einer Zeichenketten und liefert diese Zeichen als Ergebnis
auf Feld angewendet -> letztes Zeichen jeder Zeichenkette im feld entfernt
@line=("rot","schwarz","orange");
chop(@line);
print "@line\n";
---> Ausgabe: ro schwar orang
Funktion 'grep':
grep (AUSDRUCK,LISTE)
Ausdruck auf jedes Elemet des Feldes LISTE angewandt
Rückgabewert = Feld, in dem die Elemente stehen, auf die der Ausdruck zutrifft
im skalaren Kontext - Rückgabewert wie oft Ausdruck zugetroffen hat
@list=(tomatoes,tomorrow,potatoes,phantom,Tommy);
$count=grep(/tom/i,@list); # => 4
@items=grep(/tom/i,@list); # => tomatoes tomorrow phantom Tommy
/tom/i - i schaltet Unterscheidung Groß-Kleinbuchstaben ab!
Funktion 'join':
verbindet Elemente eines Feldes zu einer einzigen Zeichenketten, wobei einzelne Elemente
durch das angegebene Trennzeichen getrennt werden (Umkehrfunktion zu split)
Format: join(TRENNZEICHEN,LISTE)
$a1="eins zwei";
$a2="drei";
$a3="vier";
print join(":",$a1,$a2,$a3),"\n"; # => eins zwei:drei:vier
Funktion 'pop':
pop(FELD)
pop FELD
entfernt das letzte Element eines Feldes
@namen=("bob","dan","tom","guy");
$got=pop(@namen);
print "$got\n";
print "@namen\n";
Ausgabe:
guy
bob dan tom
Funktion 'push':
push(FELD,LISTE)
fügt Werte am Ende eines Feldes an
push(@namen,jim,archie); #-> zwei weitere Elemente zugewiesen
Funktion 'shift':
entfernt erstes Element und verschiebt alle anderen Elemente um 1 in Richtung des entfernten
Elementes
Feld wird um ein Element verkleinert:
shift(FELD)
shift FELD
shift # FELD nicht angegeben: ARGV genommen! (bei Unterprg "@_array")
@namen=("bob","dan","tom","guy");
$ret=shift @namen;
print "@namen\n"; # => dan tom guy
print "entferntes:$ret\n"; # => bob
Funktion 'splice':
entfernt und ersetzt Elemente in einem Feld
splice(FELD,OFFSET,LAENGE,LISTE)
splice(FELD,OFFSET,LAENGE)
splice(FELD,OFFSET)
OFFSET = erstes Element, was entfernt werden soll
LAENGE = Anzahl der zu entfernenden Elemente
LISTE = Liste von Elementen, die an Stelle der gelöschten Elemente
einzutragen sind
@farben=(rot,schwarz,lila,blau,braun);
print "Original-> @farben\n";
@new=splice(@farben,2,3,gelb,orange);
print "entfernt->@new\n"; => lila blau braun
print "jetzt->@farben\n"; => rot schwarz gelb orange
Funktion 'split':
split(/TRENNZEICHEN/,AUSDRUCK,LIMIT)
split(/TRENNZEICHEN/,AUSDRUCK)
split(/TRENNZEICHEN/)
split
teilt Zeichenketten (AUSDRUCK) anhand von TRENNZEICHEN (default Blank)
Ergebnis = Feld von Elementen
keine Zeichenketten angegeben -> "$_" genommen
kein TRENNZEICHEN -> Leerzeichen, Tabulator und Neue-Zeile-Zeichen genommen
LIMIT = Anzahl der Elemente, die durch Aufteilen entstehen dürfen (überschüssige im letzten
Element zusammengefaßt)
Trennzeichen in Hochkomma -> Trennung wie awk (vorlaufende Leerzeichen ignoriert)
Trennzeichen in // -> leere Elemente erzeugt (=Anzahl Leerzeichen)
perl -ne `@str=split(/:/);print $str[0],"\n" ` /etc/passwd
# USER ausgeben
Funktion 'sort':
sort(UNTERPROGRAMM LISTE)
sort(LISTE)
sort UNTERPROGRAMM LISTE
sort LISTE
sortiert Feld und gibt es als Ergebnis zurück
kein UNTERPROGRAMM -> Zeichenketten-Vergleich
Funktion 'reverse':