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 Zeilenumbruchstate— persistente lexikalische Variablen//— Defined-Or-Operatorfc— 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
| Pragma | Status |
|---|---|
strict | Geparst, teilweise erzwungen |
warnings | Geparst, teilweise Warnungskategorien |
utf8 | Geparst, Strings sind intern immer UTF-8 |
constant | Voll funktionsfähig |
base/parent | Voll funktionsfähig |
Carp | Voll funktionsfähig |
overload | Teilweise funktionsfähig |
re | Teilweise funktionsfähig |
Kommandozeilenoptionen
Diese perl5-Optionen werden nicht unterstützt:
| Option | Beschreibung |
|---|---|
-I | Include-Pfad hinzufügen (verwenden Sie stattdessen PERL5LIB) |
-M / -m | Modul von der Kommandozeile laden |
-n / -p | Implizite Eingabeschleife |
-l | Automatische Zeilenendebehandlung |
-a / -F | Autosplit-Modus |
-i | In-Place-Bearbeitung |
-x | Skript aus Nachricht extrahieren |
-T | Taint-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 localin(?{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
| Modul | Problem |
|---|---|
| Test2::API | use Module(\$lexical) verliert lexikalische Seiteneffekte zur Kompilierzeit |
| Module::CoreList | Zeitüberschreitung (>20s) wegen enormer Hash-Literale |
| charnames/unicore | Hängt von Internals::SvREADONLY ab |
| Pod::Simple::RTF | Sonderfall 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.