Perl-Programmierung: Funktionsreferenz
Aus Wikibooks
Inhaltsverzeichnis |
[Bearbeiten] Arrayfunktionen
[Bearbeiten] push, unshift
Mit push kann man einen Wert oder eine Liste von Werten hinten an einen Array anhängen, mit unshift kann man Selbiges vorne anhängen.
my @array=("Berta", "Caesar", "Dora"); push (@array, "Emil"); unshift (@array, "Anton"); print "@array\n";
Ausgabe: $ perl pushunshifttest.pl Anton Berta Caesar Dora Emil $
[Bearbeiten] pop, shift
pop entfernt den letzten Wert aus dem Array, shift den ersten.
my @array=("Anton", "Berta", "Caesar", "Dora", "Emil"); pop (@array); print "@array\n"; shift (@array); print "@array\n";
Ausgabe: $ perl popshifttest.pl Anton Berta Caesar Dora Berta Caesar Dora $
Praxisbeispiel
Mit pop und shift entfernt man nicht nur das erste Element aus einem Array, sondern gibt es auch zurück. Dies kann man sich mit Hilfe der Spezialvariablen @_ zu Nutze machen:
sub max { # Es wird standardmäßig @_ verwendet. my $a = shift; # a enthält nach Ausführung den ersten Parameter my $b = shift; # b enthält den zweiten Parameter if ($a > $b) { return $a; } else { return $b; } }
[Bearbeiten] split
Mit split kann man mit Hilfe eines Trennzeichens einen String aufteilen und die entstehenden Einzelwerte in einem Array festhalten.
my @array=split(",", "Anton,Berta,Caesar,Dora,Emil"); print "@array\n";
Ausgabe: $ perl splittest.pl Anton Berta Caesar Dora Emil $
Für das von split verwendete Trennzeichen kann jeder beliebige reguläre Ausdruck verwendet werden. Es kann außerdem mit einem dritten Parameter die Anzahl der Ergebnisse beschränkt werden. Da leere Felder ohne den dritten Parameter nicht im Array auftauchen, ist er außerdem notwendig, um eine konstante Anzahl von Feldern im Ergebnis zu erhalten. Ein negativer Wert an dieser Stelle wirkt wie ein beliebig großer Grenzwert.
my $data=<<__CSV__; eins,zwei,drei 1,, __CSV__ foreach my $line (split /\n/,$data) { print scalar @{[split /,/,$line,2]}," "; # 2 und 2 print scalar @{[split /,/,$line]}," "; # 3 und 1 print scalar @{[split /,/,$line,-1]},"\n"; # 3 und 3 }
[Bearbeiten] join
Mit join kann man umgekehrt einen Array in einen String umwandeln, und zwischen jeden Einzelwert ein Trennzeichen schieben:
my @array=("Anton", "Berta", "Caesar", "Dora", "Emil"); my $string = join(", ", @array); print $string ."\n";
Ausgabe: $ perl jointest.pl Anton, Berta, Caesar, Dora, Emil $
[Bearbeiten] sort
Sort sortiert den Inhalt eines Arrays nach ASCII-Werten.
my @array=sort ("Dora", "Berta", "Emil", "Caesar", "Anton"); print "@array\n";
Ausgabe: $ perl sorttest.pl Anton Berta Caesar Dora Emil $
[Bearbeiten] Hash-Funktionen
[Bearbeiten] keys, values
Die Funktion keys gibt jeweils eine Liste der Identifier eines Hashes zurück, die Funktion values liefert jeweils eine Liste mit den Werten.
#!/usr/bin/perl use strict; use warnings; my %hash = ( '1' => "eins", '2' => "zwei", '3' => "drei", '4' => "vier" ); for (sort keys %hash) { print "$_\n"; } for (sort values %hash) { print "$_\n"; }
Ausgabe: $ perl hash.pl 1 2 3 4 drei eins vier zwei $
[Bearbeiten] each
Die Funktion each gibt bei jedem Durchlauf das nächste Schlüssel-Wert-Paar eines Hashes aus. In einer Schleife kann man damit den gesamten Hash durchgehen.
#!/usr/bin/perl use strict; use warnings; my %hash = ( '1' => "eins", '2' => "zwei", '3' => "drei", '4' => "vier" ); for (my ($key, $value) = each %hash) { print "$key -> $value\n"; }
Ausgabe: $ perl hash2.pl 1 -> eins 2 -> zwei 3 -> drei 4 -> vier $
[Bearbeiten] Stringfunktionen
[Bearbeiten] substr
substr(ZEICHENKETTE, STARTBUCHSTABE, ANZAHLZEICHEN) erlaubt es, gezielt Bestandteile einer Zeichenkette (String) zu ermitteln. Dabei ist zu beachten, dass der 1. Buchstabe für Perl der 0. Buchstabe ist.
#!/usr/bin/perl use strict; use warnings; my $langeswort="Donaudampfschiffdudelsackpfeifer"; my $fluss=substr($langeswort, 0, 5); my $aggregatszustand=substr($langeswort, 5, 5); my $transportmittel=substr($langeswort, 10, 6); my $instrument=substr($langeswort, 16, 9); my $rauchgeraetnutzer=substr($langeswort, 25, 7); print "$fluss\n$aggregatszustand\n$transportmittel\n$instrument\n$rauchgeraetnutzer\n";
In Perl ist es mit substr außerdem möglich, schreibend auf die Zeichenkette zuzugreifen!!
... substr($langeswort, 5, 5)="segel"; print "$langeswort\n";
Ausgabe: $ perl substrtest.pl Donau dampf schiff dudelsack pfeifer Donausegelschiffdudelsackpfeifer $
[Bearbeiten] index, rindex
index(DURCHSUCHTE_ZEICHENKETTE, SUCHZEICHENKETTE, STARTPOSITION) zeigt die Position der Suchzeichenkette innerhalb der durchsuchten Zeichenkette an. Dabei beginnt index seine Suche an der Stelle der Startposition, die nicht zwingend vorgegeben werden muß. Wird keine Startposition angegeben, fängt index praktischerweise an der Stelle 0, also beim ersten Zeichen mit seiner Suche an. Wird index nicht fündig, gibt es den Rückgabewert -1 aus. index durchsucht die Zeichenkette von links nach rechts, rindex dagegen von rechts nach links.
#!/usr/bin/perl use strict; use warnings; my $durchsuchtezeichenkette="Donaudampfschiffdudelsackpfeifer"; my $suchzeichenkette="Donau"; my $ergebnis=index($durchsuchtezeichenkette, $suchzeichenkette); print "$ergebnis\n"; $suchzeichenkette="Elbe"; $ergebnis=index($durchsuchtezeichenkette, $suchzeichenkette); print "$ergebnis\n"; $suchzeichenkette="Donau"; $ergebnis=index($durchsuchtezeichenkette, $suchzeichenkette, 5); print "$ergebnis\n"; $suchzeichenkette="schiff"; $ergebnis=index($durchsuchtezeichenkette, $suchzeichenkette, 5); print "$ergebnis\n";
Ausgabe: $ perl indextest.pl 0 -1 -1 10 $
[Bearbeiten] chop und chomp
[Bearbeiten] split und join
[Bearbeiten] quotemeta
quotemeta(ZEICHENKETTE)
Der Rückgabewert ist eine Zeichenkette, wo allen Zeichen, welche in einem regulären Ausdruck eine besondere Bedeutung haben, ein umgekehrter Schrägstrich (backslash) vorangestellt ist. Diese Funktion sollte immer dann verwendet werden, wenn nach einer nicht vorherbestimmten Zeichenfolge gesucht werden soll.
#!/usr/bin/perl use strict; use warnings; open(FH,"<$0") or die "Kann den eigenen Programmcode nicht laden!"; my $text = join('',<FH>); close(FH); print "Bitte ein paar Zeichen eingeben:"; my $suche = <STDIN>; chomp($suche); $suche = quotemeta($suche); print(($text =~ /$suche/ ? "gefunden" : "nicht da"),"\n");
[Bearbeiten] mathematische Funktionen
[Bearbeiten] abs
print abs(-3.42), "\n";
Die Funktion abs liefert den Absolutwert (= vorzeichenloser Wert) des übergebenen Arguments zurück.
Ausgabe: $ perl abs.pl 3.42
[Bearbeiten] sonstige Funktionen
[Bearbeiten] bless
bless bindet eine Referenz an eine Klasse. Sehr praktisch bei der objektorientierten Programmierung.
[Bearbeiten] eval
[Bearbeiten] open
Die open-Funktion hat in Perl zweierlei Bedeutung. Zum Einen benötigt man sie für das Dateihandling, zum Anderen kann man damit Systembefehle (Pipes) abschicken und deren Ergebnis auswerten.
#!/usr/bin/perl # testlogfileanalyzer.pl use strict; use warnings; my @t= split(" ", localtime()); my $heute=$t[1] ." ". $t[2] . "\n"; open(LOGMESSAGES, "grep $heute /var/log/* |") or die "Konnte grep-Befehl nicht ausführen: $!\n"; while(<LOGMESSAGES>) { #Irgendeine Auswertungsfunktion ... } close(LOGMESSAGES) or warn "Konnte grep-Befehl nicht abschließen: $?\n";
[Bearbeiten] sub
sub wird naturgemäß in erster Linie zur Erzeugung von Subroutinen verwendet.
Ein nettes kleines Feature, das in Perl zur Verfügung steht, ist die Implementierung von ad-hoc-Subroutinen, die direkt an Ort und Stelle eingebaut werden, und nicht im Quelltext separiert werden. Das sorgt häufig für Unübersichtlichkeit und lohnt sich lediglich wenn mit Objekten, die eine Subroutine verlangen, gearbeitet wird, obwohl nur eine Kleinigkeit abgearbeitet werden muß. Sehr häufig kommt man bei der GUI-Programmierung in eine solche Situation.
[Bearbeiten] use
use dient zur Implementation von externen Modulen in den Quellcode. Eine besondere Bedeutung kommt hierbei den Pragmas zu.

