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;
    }
}

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
   }

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 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
 $

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(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

split und join

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
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 bindet eine Referenz an eine Klasse. Sehr praktisch bei der objektorientierten Programmierung.

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 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 dient zur Implementation von externen Modulen in den Quellcode. Eine besondere Bedeutung kommt hierbei den Pragmas zu.