Home / Alt manpages / perl56delta(1)

  • perl56delta(1)
  • User command
  • linux

Use perl56delta to Audit a Perl 5.005 to 5.6 Migration

You will turn perl56delta(1) into a short compatibility audit for an old Perl application. The useful result is not a list of every historical change. It is a record of which language, data, threading and extension assumptions your code makes before you move it from Perl 5.005 to Perl 5.6.0 or later.

Allow about 30 minutes for a small script and longer for a codebase with XS modules. You need the perl-doc package for the manpage, a shell, and a copy of the application or its test suite. The examples below are ordinary user commands. Do not run an old application with production input until its tests have passed.

1. Confirm which Perl you are testing

The document describes the difference between Perl 5.005 and 5.6.0. It is not a general manual for the interpreter installed today. Record the executable and its build features first, because a threaded or 64-bit build can change compatibility results.

command -v perl
perl -V:version -V:ivsize -V:useithreads

On this machine the installed interpreter reports Perl v5.38.2, 8-byte integers and threads enabled. That proves the examples run here, but it does not make the current interpreter equivalent to Perl 5.6.0. For a real upgrade, repeat the checks with the exact interpreter used by the application.

Checkpoint

Save the command output with the migration notes. If command -v perl resolves to an unexpected path, stop and fix the test environment rather than debugging the wrong Perl.

2. Read the delta as a risk register

Open the complete local document, not a shortened web summary:

man perl56delta

Start with the sections headed Core Enhancements, Modules and Pragmata, Installation and Configuration Improvements, Incompatible Changes and Known Problems. Write one note for each feature your program uses. The document is a release note for 5.6.0, so many features are described as experimental and some details have changed again in current Perl.

Give extra attention to these boundaries:

  • Threaded Perl enables interpreter cloning and changes the build and binary-compatibility story. A -Dusethreads build is not binary compatible with the corresponding 5.005 build.
  • Unicode and UTF-8 support introduce character and byte semantics. The utf8 and bytes pragmata affect lexical scope, but the old release notes warn that the I/O part of the toolkit was still evolving.
  • On 64-bit builds, bitwise numeric operators use the native integer width. Code that assumes 32-bit results, especially unary ~, needs an explicit mask.
  • Hash iteration order can change because the hashing algorithm changed. Never use the order from keys, each or a hash slice as a data format.

3. Probe the version and vector-string changes

Perl 5.6.0 added $^V, vector strings and the dotted version scheme. Use a small probe to see what the interpreter actually accepts:

perl -we '
use warnings;
our $message = "ok";
print "version=$^V message=$message\n";
printf "vector=%vd\n", $^V;
my $text = v97.98.99;
print "ordinals=$text\n";
'

Expected output includes a version line, a vector representation such as 5.38.2, and ordinals=abc. The our declaration is a lexical alias to a package variable, not a new private variable. That distinction matters when migrating code that previously relied on package globals or the vars pragma.

For compatibility checks, prefer numeric version requirements:

require 5.006;       # checked at run time
use 5.006_001;       # checked while compiling

The manpage specifically warns that using vector literals with require or use can produce misleading errors on interpreters too old to parse them. This is a common distraction: the feature test itself can fail before the intended version check runs.

4. Review source and extension hazards

Search the application for constructs called out in the delta, then run its test suite under the target Perl. Begin with:

rg -n '(^|[^[:alnum:]_])(use threads|use utf8|use bytes|our|open\s*\(|pack\s*\(|unpack\s*\(|vec\s*\(|sort\s+\$)' /path/to/project

Replace /path/to/project with the checkout you are auditing. Review matches rather than mechanically rewriting them. In particular, three-argument open is safer than the historical two-argument form because the mode and filename are separate. Test the filehandle mode and encoding deliberately; the release note does not choose an encoding for your application.

If the project has XS modules, rebuild them for the target Perl. The delta says default 5.6.0 builds were generally expected to remain binary compatible with 5.005, but threaded and multiplicity builds were exceptions, and platform hint files could break compatibility. Treat a successful compile as necessary, not sufficient: load each extension and run its tests.

Warning

Do not enable compatibility Configure options such as -DINCOMPLETE_TAINTS merely to silence failures. The manpage warns that this can produce an insecure Perl binary. Fix the code or build a properly supported target instead.

5. Run the application test and record failures

Use the project's documented test command. If it has no test runner, at least compile every Perl file without executing it:

find /path/to/project -type f -name '*.pl' -o -name '*.pm' \
  | while read -r file; do perl -c "$file" || exit 1; done

That check catches syntax and compile-time incompatibilities only. It does not exercise Unicode boundaries, hash ordering, file modes, threads, taint behaviour or XS loading. Add focused tests for each item in your risk register, and compare output semantically rather than matching diagnostic wording. The 5.6.0 notes say diagnostic text changed.

If a failure is caused by a changed construct, keep the smallest reproducer in the migration notes. Recovery is normally a source change followed by the same test run. No system-wide change is required for this audit.

Done means

  • You recorded the exact Perl executable, version, integer width and thread build.
  • You checked Unicode, version literals, 64-bit operators, hashes and threaded or XS code where relevant.
  • You used require 5.006 or use 5.006_001 rather than an unportable vector-string requirement.
  • The target interpreter compiles the project, loads its extensions and passes focused behavioural tests.
  • Every known failure has a reproducer, an owner and a safe source-level fix before deployment.