Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Unterschiede zu Perl 5

PetaPerl strebt nahezu vollständige Kompatibilität mit Perl 5.42 an, weicht jedoch in mehreren Bereichen absichtlich davon ab. Dieses Dokument katalogisiert sowohl beabsichtigte Unterschiede als auch aktuelle Einschränkungen.

Beabsichtigte Unterschiede

Standardmäßig aktive moderne Funktionen

PetaPerl aktiviert alle modernen Perl-Funktionen standardmäßig. Kein use feature oder Versionsdeklaration notwendig:

  • say — Ausgabe mit Zeilenumbruch
  • state — persistente lexikalische Variablen
  • // — Defined-Or-Operator
  • fc — Unicode-Faltung (Case Folding)
  • Unterprogramm-Signaturen

use v5.XX-Deklarationen werden geparst, haben aber keine Wirkung. PetaPerl verhält sich immer wie 5.42.

Kein XS-Support

PetaPerl lädt keine XS-Module (C-Erweiterungen). Stattdessen:

  • Native Implementierungen: Leistungskritische Module (List::Util, Scalar::Util, Digest::MD5 usw.) sind in Rust als native Funktionen reimplementiert
  • Pure-Perl-Fallback: Module mit reinen Perl-Implementierungen funktionieren automatisch
  • JIT-Kompensation: Der JIT-Compiler schließt die Leistungslücke, die XS historisch rechtfertigte

Dies ist eine strategische Entscheidung: XS bindet Perl an eine C-Aufrufkonvention und verhindert JIT-Optimierung. PetaPerls JIT + Auto-Parallelisierung macht reines Perl wettbewerbsfähig gegenüber XS.

Nur Linux

PetaPerl läuft ausschließlich auf Linux (jede von Cranelift unterstützte Architektur: x86-64, AArch64, RISC-V, s390x). Kein Windows, macOS, BSD oder andere Plattformen.

$^O gibt immer "linux" zurück.

p5-Laufzeitumgebung

PetaPerl enthält ein experimentelles --p5-Flag, das eine eigenständige Perl-5-kompatible Laufzeitumgebung verwendet. Dies ist ein alternativer Ausführungsmodus, nicht der Standard.

Versionsangabe

$] meldet 5.042000 und $^V meldet v5.42.0. Code, der diese Werte prüft, sieht PetaPerl als Perl-5.42-Interpreter.

Nicht implementierte Funktionen

tie/tied/untie

Der tie-Mechanismus wird geparst und die Funktionen existieren, aber sie sind Stubs, die undef zurückgeben. Gebundene Variablen führen keine Dispatch-Aufrufe an die Tie-Klassenmethoden aus.

Module, die auf tie angewiesen sind (z. B. Tie::File, Tie::Hash::NamedCapture-Interna), funktionieren nicht korrekt.

Formate

format/write/formline werden geparst, aber das Format-Ausgabesystem ist nicht implementiert. write und formline sind Stubs. Verwenden Sie stattdessen printf/sprintf.

Lvalue-Unterprogramme

Das :lvalue-Attribut wird geparst, aber nicht erzwungen. Unterprogramme, die mit :lvalue deklariert sind, verhalten sich wie normale Unterprogramme.

Internals::SvREADONLY

Nicht implementiert. Dies betrifft Module, die auf das Markieren von Skalaren als schreibgeschützt angewiesen sind (charnames, unicore).

Einige Pragmas

PragmaStatus
strictGeparst, teilweise erzwungen
warningsGeparst, teilweise Warnungskategorien
utf8Geparst, Strings sind intern immer UTF-8
constantVoll funktionsfähig
base/parentVoll funktionsfähig
CarpVoll funktionsfähig
overloadTeilweise funktionsfähig
reTeilweise funktionsfähig

Kommandozeilenoptionen

Diese perl5-Optionen werden nicht unterstützt:

OptionBeschreibung
-IInclude-Pfad hinzufügen (verwenden Sie stattdessen PERL5LIB)
-M / -mModul von der Kommandozeile laden
-n / -pImplizite Eingabeschleife
-lAutomatische Zeilenendebehandlung
-a / -FAutosplit-Modus
-iIn-Place-Bearbeitung
-xSkript aus Nachricht extrahieren
-TTaint-Modus

Bekannte Einschränkungen

Regex-Engine

PetaPerls Regex-Engine besteht 99,3 % von perl5s re_tests (1959/1972). Bekannte Lücken:

  • Selbstreferentielle Captures (z. B. (a\1)) — 3 Tests
  • local in (?{code})-Blöcken — 2 Tests
  • Mehrzeichen-Unicode-Faltung (Case Folding) — 2 Tests
  • Rückreferenzen in Branch-Reset-Gruppen — 5 Tests
  • Sonderfälle bei String-Interpolation — 1 Test

Modulkompatibilität

ModulProblem
Test2::APIuse Module(\$lexical) verliert lexikalische Seiteneffekte zur Kompilierzeit
Module::CoreListZeitüberschreitung (>20s) wegen enormer Hash-Literale
charnames/unicoreHängt von Internals::SvREADONLY ab
Pod::Simple::RTFSonderfall beim Flip-Flop-Operator

Flip-Flop-Operator

Die Operatoren .. und ... im skalaren Kontext (Flip-Flop) haben Sonderfälle, in denen sich pperls Verhalten von perl5 unterscheidet. Die gängigsten Verwendungen funktionieren, aber komplexe Verkettungen können Fehler auslösen.

Filehandle-Heuristiken

print $x, "\n" interpretiert $x als mögliches Filehandle (entsprechend dem perl5-Verhalten). Für Variablen, die Filehandle-Referenzen enthalten, verwenden Sie die Blockform: print {$fh} "data\n".

Kompilierzeit-Moduleffekte

use Module(args) läuft in perl5 zur Kompilierzeit. Module, die lexikalische Seiteneffekte zur Kompilierzeit erzeugen (z. B. use Instance(\$INST)), funktionieren möglicherweise nicht, da pperls Laufzeitumgebung diese Effekte nicht erneut abspielt. Seiteneffekte auf Paketvariablen funktionieren korrekt.