PetaPerl implementiert die eingebaute Funktionsbibliothek von Perl 5. Dieses Dokument listet alle implementierten Funktionen auf, nach Kategorien geordnet.
Legende:
- ✅ Vollständig implementiert
- ⚠️ Teilweise implementiert
- ❌ Noch nicht implementiert
| Funktion | Status | Beschreibung |
print | ✅ | Ausgabe auf Dateihandle oder STDOUT |
say | ✅ | Ausgabe mit Zeilenumbruch |
printf | ✅ | Formatierte Ausgabe |
sprintf | ✅ | Formatierte Zeichenkette |
print "Hello\n";
print $fh "data\n";
say "Hello"; # Fuegt Zeilenumbruch hinzu
printf "%d Elemente\n", $count;
my $str = sprintf "%05d", $num;
| Funktion | Status | Beschreibung |
open | ✅ | Datei oder Pipe oeffnen |
close | ✅ | Dateihandle schliessen |
read | ✅ | Daten fester Laenge lesen |
sysread | ✅ | Lesen auf Systemebene |
syswrite | ✅ | Schreiben auf Systemebene |
readline | ✅ | Zeile(n) vom Dateihandle lesen |
getc | ✅ | Einzelnes Zeichen lesen |
eof | ✅ | Auf Dateiende pruefen |
seek | ✅ | Dateihandle positionieren |
tell | ✅ | Position des Dateihandles abfragen |
fileno | ✅ | Dateideskriptornummer abfragen |
binmode | ✅ | Binaermodus setzen |
select | ✅ | Standard-Dateihandle setzen |
write | ✅ | Formatierten Datensatz schreiben |
open my $fh, '<', $filename or die $!;
my $data;
read $fh, $data, 1024; # 1024 Bytes lesen
my $line = readline($fh); # oder <$fh>
my $char = getc($fh);
seek $fh, 0, 0; # Zum Anfang zurueckspulen
my $pos = tell $fh;
close $fh;
| Funktion | Status | Beschreibung |
opendir | ✅ | Verzeichnishandle oeffnen |
readdir | ✅ | Verzeichniseintrag lesen |
closedir | ✅ | Verzeichnishandle schliessen |
rewinddir | ✅ | Verzeichnishandle zuruecksetzen |
seekdir | ✅ | Verzeichnishandle positionieren |
telldir | ✅ | Verzeichnisposition abfragen |
mkdir | ✅ | Verzeichnis erstellen |
rmdir | ✅ | Verzeichnis entfernen |
chdir | ✅ | Arbeitsverzeichnis wechseln |
opendir my $dh, $dir or die $!;
my @entries = readdir $dh;
closedir $dh;
mkdir "newdir", 0755 or die $!;
rmdir "olddir";
chdir "/tmp";
| Funktion | Status | Beschreibung |
unlink | ✅ | Dateien loeschen |
rename | ✅ | Datei umbenennen |
link | ✅ | Harten Link erstellen |
symlink | ✅ | Symbolischen Link erstellen |
readlink | ✅ | Symbolischen Link lesen |
chmod | ✅ | Dateiberechtigungen aendern |
chown | ✅ | Dateibesitzer/-gruppe aendern |
utime | ✅ | Zugriffs-/Aenderungszeiten aendern |
truncate | ✅ | Datei auf Laenge kuerzen |
stat | ✅ | Dateistatus abfragen |
lstat | ✅ | Dateistatus abfragen (ohne Link-Verfolgung) |
glob | ✅ | Dateinamenerweiterung |
unlink "file.txt" or die $!;
rename "old.txt", "new.txt";
link "source", "link";
symlink "target", "symlink";
my $target = readlink "symlink";
chmod 0644, @files;
chown $uid, $gid, @files;
utime $atime, $mtime, @files;
truncate $fh, $length;
my @info = stat $file;
my @info = lstat $symlink; # Folgt keinem Symlink
my @files = glob "*.txt";
| Funktion | Status | Beschreibung |
length | ✅ | Zeichenketten-/Array-Laenge |
substr | ✅ | Teilzeichenkette extrahieren/ersetzen |
index | ✅ | Position einer Teilzeichenkette finden |
rindex | ✅ | Teilzeichenkette finden (rueckwaerts) |
chr | ✅ | Zahl in Zeichen umwandeln |
ord | ✅ | Zeichen in Zahl umwandeln |
lc | ✅ | Zeichenkette in Kleinbuchstaben |
uc | ✅ | Zeichenkette in Grossbuchstaben |
lcfirst | ✅ | Erstes Zeichen in Kleinbuchstaben |
ucfirst | ✅ | Erstes Zeichen in Grossbuchstaben |
quotemeta | ✅ | Metazeichen quotieren |
chop | ✅ | Letztes Zeichen entfernen |
chomp | ✅ | Zeilenende entfernen |
hex | ✅ | Hexadezimale Zeichenkette in Zahl |
oct | ✅ | Oktale Zeichenkette in Zahl |
pack | ✅ | Werte in Binaerzeichenkette packen |
unpack | ✅ | Binaerzeichenkette entpacken |
vec | ✅ | Bitvektorzugriff |
my $len = length $str;
my $sub = substr $str, 0, 5; # Erste 5 Zeichen
substr($str, 7, 5) = "replace"; # Lvalue-substr
my $pos = index $str, "find";
my $rpos = rindex $str, "last";
my $char = chr(65); # "A"
my $code = ord("A"); # 65
my $lower = lc "HELLO"; # "hello"
my $upper = uc "hello"; # "HELLO"
my $cap = ucfirst "hello"; # "Hello"
chomp $line; # Entfernt \n falls vorhanden
chop $str; # Entfernt letztes Zeichen
my $quoted = quotemeta '.*'; # '\\.\\\*'
my $num = hex "FF"; # 255
my $num = oct "377"; # 255
Lvalue-substr: substr kann als Zuweisungsziel verwendet werden.
substr($str, 0, 3) = "New"; # Ersetzt die ersten 3 Zeichen
| Funktion | Status | Beschreibung |
push | ✅ | An Array anhaengen |
pop | ✅ | Letztes Element entfernen |
shift | ✅ | Erstes Element entfernen |
unshift | ✅ | Vor Array stellen |
splice | ✅ | Array-Elemente entfernen/ersetzen |
join | ✅ | Array mit Trennzeichen verbinden |
split | ✅ | Zeichenkette in Array aufteilen |
reverse | ✅ | Liste/Zeichenkette umkehren |
sort | ✅ | Liste sortieren |
grep | ✅ | Liste filtern |
map | ✅ | Liste transformieren |
push @arr, $val;
push @arr, @more;
my $last = pop @arr;
my $first = shift @arr;
unshift @arr, $val;
splice @arr, $offset, $length, @replacement;
my $str = join ",", @arr;
my @parts = split /,/, $str;
my @reversed = reverse @arr;
my @sorted = sort @arr;
my @sorted = sort { $a <=> $b } @numbers;
my @filtered = grep { $_ > 10 } @numbers;
my @doubled = map { $_ * 2 } @numbers;
Parallele Ausfuehrung: map, grep und einfache for-Schleifen koennen bei Unbedenklichkeit parallel ausgefuehrt werden.
| Funktion | Status | Beschreibung |
keys | ✅ | Hash-Schluessel abfragen |
values | ✅ | Hash-Werte abfragen |
each | ✅ | Schluessel-Wert-Paare iterieren |
exists | ✅ | Existenz eines Schluessels pruefen |
delete | ✅ | Hash-Schluessel entfernen |
my @keys = keys %hash;
my @vals = values %hash;
while (my ($k, $v) = each %hash) { ... }
if (exists $hash{key}) { ... }
my $removed = delete $hash{key};
Kontextsensitivitaet: keys und values geben im Listenkontext eine Liste zurueck, im skalaren Kontext die Anzahl.
my $count = keys %hash; # Anzahl der Schluessel
my @all_keys = keys %hash; # Alle Schluessel
| Funktion | Status | Beschreibung |
abs | ✅ | Absolutwert |
int | ✅ | Ganzzahlige Abschneidung |
sqrt | ✅ | Quadratwurzel |
sin | ✅ | Sinus |
cos | ✅ | Kosinus |
exp | ✅ | e hoch Potenz |
log | ✅ | Natuerlicher Logarithmus |
atan2 | ✅ | Arkustangens von y/x |
rand | ✅ | Zufallszahl |
srand | ✅ | Zufallsgenerator initialisieren |
my $abs = abs -5; # 5
my $int = int 3.7; # 3
my $sqrt = sqrt 16; # 4
my $sin = sin $angle;
my $cos = cos $angle;
my $exp = exp 1; # e
my $log = log 10;
my $atan = atan2 $y, $x;
my $rand = rand 10; # 0 bis <10
srand 42; # Mit bestimmtem Wert initialisieren
| Funktion | Status | Beschreibung |
ref | ✅ | Referenztyp abfragen |
bless | ✅ | Referenz in Paket segnen |
defined | ✅ | Auf Definiertheit pruefen |
undef | ✅ | Variable undefinieren |
scalar | ✅ | Skalaren Kontext erzwingen |
my $type = ref $value; # 'ARRAY', 'HASH', 'CODE' usw.
my $obj = bless {}, 'MyClass';
my $obj = bless $ref, 'MyClass';
if (defined $var) { ... }
undef $var; # Auf undef setzen
my $count = scalar @arr; # Skalaren Kontext erzwingen
| Funktion | Status | Beschreibung |
caller | ✅ | Aufruferinformation abfragen |
wantarray | ✅ | Aufrufkontext abfragen |
prototype | ✅ | Unterprogramm-Prototyp abfragen |
pos | ✅ | Regex-Position abfragen/setzen |
study | ✅ | Regex-Abgleich optimieren |
reset | ✅ | Variablen zuruecksetzen |
my ($package, $file, $line) = caller;
my ($pkg, $file, $line, $sub) = caller(1);
if (wantarray) {
return @list;
} else {
return $scalar;
}
my $proto = prototype \&mysub;
my $pos = pos $str;
study $str; # Fuer wiederholten Regex-Abgleich optimieren
reset; # ??-Suchen zuruecksetzen
| Funktion | Status | Beschreibung |
die | ✅ | Ausnahme ausloesen |
warn | ✅ | Warnung ausgeben |
exit | ✅ | Programm beenden |
system | ✅ | Externen Befehl ausfuehren |
exec | ✅ | Ausfuehren und Prozess ersetzen |
fork | ✅ | Kindprozess erzeugen |
wait | ✅ | Auf Kindprozess warten |
waitpid | ✅ | Auf bestimmten Kindprozess warten |
sleep | ✅ | Fuer Sekunden pausieren |
time | ✅ | Aktuelle Unix-Zeit abfragen |
times | ✅ | Prozesszeiten abfragen |
localtime | ✅ | Zeit in Ortszeit umwandeln |
gmtime | ✅ | Zeit in GMT umwandeln |
getlogin | ✅ | Anmeldenamen abfragen |
die "Fehler: $!" if $error;
warn "Warnmeldung";
exit 0;
my $status = system "ls", "-l";
exec "command", @args; # Kehrt bei Erfolg nicht zurueck
my $pid = fork;
if ($pid == 0) {
# Kindprozess
} else {
# Elternprozess
}
wait; # Auf beliebigen Kindprozess warten
waitpid $pid, 0; # Auf bestimmten Kindprozess warten
sleep 5; # 5 Sekunden pausieren
my $now = time;
my @times = times; # (user, system, cuser, csystem)
my @lt = localtime time;
my @gmt = gmtime time;
my $user = getlogin;
Alle Benutzer-/Gruppendatenbankfunktionen sind implementiert:
| Funktion | Status | Beschreibung |
getpwnam | ✅ | Passworteintrag nach Name abfragen |
getpwuid | ✅ | Passworteintrag nach UID abfragen |
getpwent | ✅ | Naechsten Passworteintrag abfragen |
setpwent | ✅ | Passwort-Iteration zuruecksetzen |
endpwent | ✅ | Passwort-Iteration beenden |
getgrnam | ✅ | Gruppeneintrag nach Name abfragen |
getgrgid | ✅ | Gruppeneintrag nach GID abfragen |
getgrent | ✅ | Naechsten Gruppeneintrag abfragen |
setgrent | ✅ | Gruppen-Iteration zuruecksetzen |
endgrent | ✅ | Gruppen-Iteration beenden |
my @pwinfo = getpwnam "username";
my @pwinfo = getpwuid $uid;
while (my @entry = getpwent) { ... }
endpwent;
my @grinfo = getgrnam "groupname";
my @grinfo = getgrgid $gid;
Alle Netzwerkdatenbankfunktionen sind implementiert:
| Funktion | Status | Beschreibung |
gethostbyname | ✅ | Host nach Name abfragen |
gethostbyaddr | ✅ | Host nach Adresse abfragen |
gethostent | ✅ | Naechsten Hosteintrag abfragen |
sethostent | ✅ | Host-Iteration zuruecksetzen |
endhostent | ✅ | Host-Iteration beenden |
getnetbyname | ✅ | Netzwerk nach Name abfragen |
getnetbyaddr | ✅ | Netzwerk nach Adresse abfragen |
getnetent | ✅ | Naechsten Netzwerkeintrag abfragen |
setnetent | ✅ | Netzwerk-Iteration zuruecksetzen |
endnetent | ✅ | Netzwerk-Iteration beenden |
getprotobyname | ✅ | Protokoll nach Name abfragen |
getprotobynumber | ✅ | Protokoll nach Nummer abfragen |
getprotoent | ✅ | Naechsten Protokolleintrag abfragen |
setprotoent | ✅ | Protokoll-Iteration zuruecksetzen |
endprotoent | ✅ | Protokoll-Iteration beenden |
getservbyname | ✅ | Dienst nach Name abfragen |
getservbyport | ✅ | Dienst nach Port abfragen |
getservent | ✅ | Naechsten Diensteintrag abfragen |
setservent | ✅ | Dienst-Iteration zuruecksetzen |
endservent | ✅ | Dienst-Iteration beenden |
my @host = gethostbyname "example.com";
my @net = getnetbyname "loopback";
my @proto = getprotobyname "tcp";
my @serv = getservbyname "http", "tcp";
| Funktion | Status | Beschreibung |
tie | ⚠️ | Variable an Objekt binden (Stub – gibt undef zurueck) |
tied | ⚠️ | Gebundenes Objekt abfragen (Stub – gibt undef zurueck) |
untie | ⚠️ | Variable entbinden (Stub – keine Wirkung) |
Die Funktionen werden erkannt und sind aufrufbar, leiten aber nicht an Tie-Klassenmethoden weiter. Module, die auf tie angewiesen sind (z.B. Tie::File), funktionieren nicht korrekt.
| Funktion | Status | Beschreibung |
formline | ⚠️ | Zeile formatieren (Stub) |
write | ⚠️ | Formatierte Ausgabe schreiben (Stub) |
Perl-Formate sind ein veraltetes Feature. Die Funktionen existieren, aber das Formatausgabesystem ist nicht implementiert. Verwende stattdessen printf/sprintf.
Alle Socket-Operationen sind implementiert:
| Funktion | Status | Beschreibung |
socket | ✅ | Socket erstellen |
socketpair | ✅ | Socket-Paar erstellen |
bind | ✅ | Socket an Adresse binden |
listen | ✅ | Auf Socket lauschen |
accept | ✅ | Verbindung annehmen |
connect | ✅ | Mit Gegenstelle verbinden |
shutdown | ✅ | Socket herunterfahren |
send | ✅ | Daten senden |
recv | ✅ | Daten empfangen |
getsockopt | ✅ | Socket-Option abfragen |
setsockopt | ✅ | Socket-Option setzen |
getsockname | ✅ | Lokale Adresse abfragen |
getpeername | ✅ | Entfernte Adresse abfragen |
| Funktion | Status | Beschreibung |
pipe | ✅ | Pipe erstellen |
msgctl | ✅ | Nachrichtenwarteschlangensteuerung |
msgget | ✅ | Nachrichtenwarteschlange abfragen |
msgsnd | ✅ | Nachricht senden |
msgrcv | ✅ | Nachricht empfangen |
semctl | ✅ | Semaphorsteuerung |
semget | ✅ | Semaphorsatz abfragen |
semop | ✅ | Semaphoroperationen |
shmctl | ✅ | Gemeinsamer-Speicher-Steuerung |
shmget | ✅ | Gemeinsamen Speicher abfragen |
shmread | ✅ | Gemeinsamen Speicher lesen |
shmwrite | ✅ | Gemeinsamen Speicher schreiben |
qr// ist vollstaendig implementiert einschliesslich Wiederverwendung vorkompilierter Muster
(?{code}) eingebettete Codeausfuehrung ist implementiert
- Possessive Quantifizierer (
*+, ++, ?+) sind implementiert
- Siehe Regulaere Ausdruecke fuer verbleibende Randfaelle (selbstreferenzierende Erfassungen, Mehrzeichenfaltung bei Gross-/Kleinschreibung)
use und require funktionieren fuer Pure-Perl-Module
- XS-Module werden nicht unterstuetzt (native Neuimplementierungen fuer gaengige Module vorhanden)
- Einige Pragma-Auswirkungen koennen von perl5 abweichen
- Die meisten speziellen Variablen werden befuellt (
$^O, $^X, $], $^V usw.)
Internals::SvREADONLY ist nicht implementiert
PetaPerl fuehrt Konstantenfaltung zur Uebersetzungszeit durch fuer:
length("hello") # Wird zur Uebersetzungszeit zu 5 gefaltet
substr("text", 0, 2) # Wird zu "te" gefaltet
Diese Funktionen koennen bei Unbedenklichkeit parallel ausgefuehrt werden:
map - Parallele Elementtransformation
grep - Parallele Filterung
sort mit reiner Vergleichsfunktion
Parallelisierung erfordert:
- Keine Seiteneffekte im Callback
- Keinen gemeinsam veraenderbaren Zustand
- Array-Groesse ueber der Parallelisierungsschwelle
- Zeichenkettenfunktionen verwenden UTF-8-bewusste Operationen
- Array-Operationen minimieren Kopien
- Hash-Operationen verwenden optimierte Hashtabellen
- Mathematische Funktionen werden wenn moeglich auf CPU-Befehle abgebildet