Die Skriptsprache
Perl (6)
Wolfgang Friebel
DESY Zeuthen
Anmerkungen zum ersten Teil

Folgende man Pages wurden (teilweise) behandelt:
 perlsyn,
perlop, perldata, perlre, perlfunc, perlvar,
perlsub, perlipc, perldebug, perlsec, perlrun, perlfaq

Folgende Module wurden (teilweise) besprochen:
 POSIX,
Date::Manip, Date::Format, Date::Parse,
Getopt::Std, Getopt::Long, Term::ReadKey,
Term::ReadLine, RPC::PlServer, Devel::Dprof,
Dumpvalue, Benchmark
Inhalt des Kurses (2)


Teil 1 Grundlegende Konzepte
Teil 2 Objektorientiertes Perl
 1.
Referenzen und Datenstrukturen
 2. Grundlagen der Objektorientierung
 3. Elemente der Objektorientierung in Perl
 4. Klassen und Vererbung
 5. Weiterführende Themen (tie, persistence)

Teil 3 Wichtige Perl Module
1. Referenzen und Datenstrukturen

Referenzen sind Zeiger auf Datentypen
 Notation



durch vorangestelltes \ (z.B \@feld)
Referenzen passen in einen Skalar: $ref=\@feld;
alle Datentypen können referenziert werden: \&sub
Dereferenzierung mit Datentyp-Prefix ($ @ % &)
@feld = @$ref;

Vorrangregeln durch {} modifizieren
$element=${$ref}[0]; @feld=@{$refs[0]};
Dereferenzierung mit ->

Dereferenzierung mit Präfix unübersichtlich:
${$aref}[0] = ${$href}{key0};

Arraynotation ist leserlicher:
$aref->[0] = $href->{key0};

Besonders nützlich bei Subroutine-Referenzen:
statt &{$subref}($arg1, $arg2); schreibt man
$subref->($arg1, $arg2);
Referenztyp


Bestimmung des Typs mit ref $ref_var
ref liefert als Rückgabewert Typ der Referenz
 undef,
falls Argument keine Referenz
 SCALAR, ARRAY,HASH,CODE als Referenztyp
 REF, falls Referenz auf Referenz
 Objektklasse für Objekt (siehe später)

Benutzung einer Referenz in String liefert
Referenztyp und Adresse
Anonyme Arrays




Feld wird definiert mit @feld=(1, 2, 3);
Referenz auf Array $ptr=\@feld;
Feldname wird für Zugriff nicht benötigt: $ptr->[0]
Anonymes Feld wird als Referenz auf Feld definiert
$feld = [1, 2, 3]; # $feld ist Referenz
@feld = (1, 2, 3); # normale Felddefinition

Zugriff mit
$feld->[1] = 2;
Mehrdimensionale Arrays

Bei Liste von Feldern verwischen Feldgrenzen:
((1,2,3), (4,5,6)) äquivalent zu (1,2,3,4,5,6)


Daher besser: @matrix=(\@row1, \@row2);
Verwendung anonymer Arrays vereinfacht Notation
$matrix = [ [1,2,3], [4,5,6] ];

Zugriff mit Arraynotation
$matrix->[1]->[2]; oder $matrix->[1][2];
Anonyme Hashes



Hashdefinition mit %hash=(num=>1, str=>’a’);
Auch hier Name des Hashes nicht nötig
Anonymer Hash als Referenz auf Hash definiert
$hash={num=>1, str=>’a’}; # $hash ist Ref
@hash=(num=>1, str=>’a’); # normaler Hash

Zugriff mit
$hash->{num} = 2;
Datenstrukturen

Mehrdimensionale Hashes analog zu Arrays:
{a=>{aa=>1, bb=>2}, b=>{aa=>2, cc=>3}}



Zugriff analog: $hash->{b}{aa} = 2;
Gemischte Datenelemente (Records)
am besten als anonymer Hash mit Datenelementen
 Keys
sind Strings, Werte sind:
 Skalare, anonyme Arrays, anonyme Hashes
 Referenzen auf andere Datenstrukturen
Beispiel Datenstruktur
$record = {familyname=>$name,
firstnames=>\@names,
accounts =>[$name, ’guest’],
access
=>{linux=>’accept’,
irix =>’deny’
},
room
=>’1R06’,
};
login($record->{accounts}->[0]);
Pseudohashes



Neues Konzept in Perl5.005
Zugriff auf Pseudohash wie auf Array oder Hash
Dazu bei Definition Zuordnung Key<->Index nötig:
$pseudo = [ {a=>1, b=>2}, ’eins’, ’zwei’];
$pseudo->[1] #liefert ’eins’
$pseudo->{a} #liefert ebenfalls ’eins’


Erlaubt Eingrenzung auf vordefinierte Keys
Optimierung mit der Direktive use fields;
Anonyme Subroutinen



Subroutine wird definiert mit sub name {block};
Aufruf name(args) oder &name(args) oder &name;
Bei Aufruf mit &name; wird @_ übergeben
 geeignet

für Parameterweitergabe in Subroutine
Definition einer anonymen Subroutine
$sub_ref = sub {block};

Aufruf mit
$sub_ref->(args);

Wird für OO Programmierung mit Perl benutzt
Closures

Zugriff auf lokale Variablen mit Subroutine
{ my $count=0;
sub incr { $count++; print ”$count\n”}
sub decr { $count--; print ”$count\n”}
}



Zugrif auf lokale Variable nur noch per Subroutine
Variable bleibt erhalten, da Referenzcount != 0
Keine Manipulationsmöglichkeit von $count
Parameterübergabe



Übergabe per Referenz im Feld @_
Wird @_ modifiziert, so auch Aufrufargument
Vermeidung durch Kopie der Argumente
my ($arg1, $arg2) = @_;

Übergabe von Feldern als Referenzen, sonst alle
Argumente im ersten Array:
matrix(@row1, @row2); # alle Elemente in @_
matrix(\@row1, \@row2); # @$_[0] = @row1;
Hausaufgaben






Erzeuge je eine Referenz auf Variable, Array und Hash
Benutze die zwei Methoden der Dereferenzierung
Schreibe eine Subroutine, die den Argumenttyp bestimmt
Erzeuge ein mehrdimensionales anonymes Array und
arbeite damit
Erzeuge eine komplexe Datenstruktur mit einem anonymen
Hash und bearbeite diese in einer Subroutine
Lies die manpages perlref und perldsc und perllol

Die Skriptsprache Perl (6)