Perl-Programmierung: Funktionsreferenz
Arrayfunktionen
[Bearbeiten]push, unshift
[Bearbeiten]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 $
pop, shift
[Bearbeiten]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;
}
}
split
[Bearbeiten]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
}
join
[Bearbeiten]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 $
sort
[Bearbeiten]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 $
Hash-Funktionen
[Bearbeiten]keys, values
[Bearbeiten]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 $
each
[Bearbeiten]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 $
Stringfunktionen
[Bearbeiten]substr
[Bearbeiten]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 $
index, rindex
[Bearbeiten]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 $
chop und chomp
[Bearbeiten]Vgl. Perldoc: -f chop und Perldoc: -f chomp
split und join
[Bearbeiten]quotemeta
[Bearbeiten]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");
mathematische Funktionen
[Bearbeiten]abs
[Bearbeiten]print abs(-3.42), "\n";
Die Funktion abs
liefert den Absolutwert (= vorzeichenloser Wert) des übergebenen Arguments zurück.
Ausgabe: $ perl abs.pl 3.42
sonstige Funktionen
[Bearbeiten]bless
[Bearbeiten]bless
bindet eine Referenz an eine Klasse. Sehr praktisch bei der objektorientierten Programmierung.
eval
[Bearbeiten]open
[Bearbeiten]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";
sub
[Bearbeiten]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.
use
[Bearbeiten]use
dient zur Implementation von externen Modulen in den Quellcode. Eine besondere Bedeutung kommt hierbei den Pragmas zu.