Differences from Perl 5#

PetaPerl targets near-complete compatibility with Perl 5.42, but intentionally diverges in several areas. This document catalogs both intentional differences and current limitations.

Intentional Differences#

Always-On Modern Features#

PetaPerl enables all modern Perl features by default. No use feature or version declaration is needed:

  • say — print with newline

  • state — persistent lexical variables

  • // — defined-or operator

  • fc — Unicode case folding

  • Subroutine signatures

use v5.XX declarations are parsed but have no effect. PetaPerl always behaves like 5.42.

No XS Support#

PetaPerl does not load XS (C extension) modules. Instead:

  • Native implementations: Performance-critical modules (List::Util, Scalar::Util, Digest::MD5, etc.) are reimplemented in Rust as native functions

  • Pure Perl fallback: Modules with Pure Perl implementations work automatically

  • JIT compensation: The JIT compiler closes the performance gap that historically justified XS

This is a strategic decision: XS ties Perl to a C calling convention and prevents JIT optimization. PetaPerl’s JIT + auto-parallelization makes Pure Perl competitive with XS.

Linux Only#

PetaPerl runs on Linux exclusively (any architecture supported by Cranelift: x86-64, AArch64, RISC-V, s390x). No Windows, macOS, BSD, or other platforms.

$^O always returns "linux".

Dual Runtimes#

PetaPerl’s default runtime is the P5 runtime — a self-contained Perl 5 compatible runtime, a line-for-line Rust transliteration of perl5’s C interpreter. The alternative PP runtime (--pp) uses a native Rust parser and interpreter with JIT and auto-parallelization support.

Version Reporting#

$] reports 5.042000 and $^V reports v5.42.0. Code that checks these values will see PetaPerl as a perl 5.42 interpreter.

Unimplemented Features#

tie/tied/untie#

The tie mechanism is parsed and the functions exist, but they are stubs that return undef. Tied variables do not dispatch to the tie class methods.

Modules that depend on tie (e.g., Tie::File, Tie::Hash::NamedCapture internals) will not function correctly.

Formats#

format/write/formline are parsed but the format output system is not implemented. write and formline are stubs. Use printf/sprintf instead.

Lvalue Subroutines#

The :lvalue attribute is parsed but not enforced. Subroutines declared with :lvalue behave like normal subroutines.

Internals::SvREADONLY#

Not implemented. This affects modules that rely on marking scalars read-only (charnames, unicore).

Some Pragmas#

Pragma

Status

strict

Parsed, partially enforced

warnings

Parsed, partial warning categories

utf8

Parsed, strings are always UTF-8 internally

constant

Fully working

base/parent

Fully working

Carp

Fully working

overload

Partially working

re

Partially working

Command-Line Flags#

These perl5 flags are not supported:

Flag

Description

-I

Add include path (use PERL5LIB instead)

-M / -m

Load module from command line

-n / -p

Implicit input loop

-l

Automatic line-ending processing

-a / -F

Autosplit mode

-i

In-place edit

-x

Extract script from message

-T

Taint mode

Known Limitations#

Regex Engine#

PetaPerl’s regex engine passes 99.3% of perl5’s re_tests (1959/1972). Known gaps:

  • Self-referential captures (e.g., (a\1)) — 3 tests

  • local in (?{code}) blocks — 2 tests

  • Multi-character Unicode case folding — 2 tests

  • Branch reset group backreferences — 5 tests

  • String interpolation edge cases — 1 test

Module Compatibility#

Module

Issue

Test2::API

use Module(\$lexical) loses compile-time lexical side effects

Module::CoreList

Timeout (>20s) due to enormous hash literals

charnames/unicore

Depends on Internals::SvREADONLY

Pod::Simple::RTF

Flip-flop operator edge case

Flip-Flop Operator#

The .. and ... operators in scalar context (flip-flop) have edge cases where pperl’s behavior differs from perl5. Most common uses work, but complex chaining may trigger errors.

Filehandle Heuristics#

print $x, "\n" interprets $x as a potential filehandle (matching perl5 behavior). For variables that hold filehandle references, use the block form: print {$fh} "data\n".

Compile-Time Module Effects#

use Module(args) runs at compile time in perl5. Modules that produce lexical side effects at compile time (e.g., use Instance(\$INST)) may not work because pperl’s runtime doesn’t replay those effects. Package-variable side effects work correctly.