LifeKeeper release 10.1 upgrades the distributed Perl runtime from version 5.32.1 to 5.42.0. This upgrade spans the Perl 5.34, 5.36, 5.38, 5.40, and 5.42 release series. The official release notes for these versions are available from the Perl project:

Perl 5.34: https://perldoc.perl.org/perl5340delta
Perl 5.36: https://perldoc.perl.org/perl5360delta
Perl 5.38: https://perldoc.perl.org/perl5380delta
Perl 5.40: https://perldoc.perl.org/perl5400delta
Perl 5.42: https://perldoc.perl.org/perl5420delta

This guide is intended to raise awareness of considerations for customers using the Perl programming language with SIOS LifeKeeper Generic Application (GenApp) resources.

Most LifeKeeper Perl code that currently executes cleanly under Perl 5.32 with “use strict” and “use warnings” enabled is expected to continue functioning under Perl 5.42. The primary migration risk is changes in diagnostics, deprecations, bundled module versions, and assumptions made by legacy code.

Experimental language features have continued to be introduced throughout the 5.34 through 5.42 release cycle. Perl 5.34 introduced experimental try/catch support https://perldoc.perl.org/perl5340delta#Experimental-Try/Catch-Syntax, while Perl 5.42 adds additional object-oriented language features including lexical methods and method invocation enhancements https://perldoc.perl.org/perl5420delta#Lexical-method-declaration-using-my-method
These features are not currently used within LifeKeeper and should generally be avoided unless there is a specific requirement and sufficient testing coverage.

Modules shipped with Perl have been updated in every release between 5.32 and 5.42. Any bundled CPAN modules, recovery kit code, installation utilities, build scripts, or third-party integrations should be validated against the updated runtime. The module upgrade lists contained in each perldelta document should be consulted when investigating compatibility issues.

Hash ordering remains non-deterministic and should never be relied upon for application logic. Code requiring a stable ordering should explicitly sort keys before processing.

Any deprecation warnings observed during testing should be treated as defects. Perl has continued to remove or restrict legacy behaviors that were previously retained for backward compatibility. The official deprecation and incompatibility sections of each perldelta document should be reviewed when investigating warnings or runtime failures encountered during migration.

Along with logic and syntax changes there have been numerous CVEs that were addressed and fixed. The CVEs that affected LifeKeeper for Windows are as follows:

CVE-2023-47038: https://nvd.nist.gov/vuln/detail/cve-2023-47038
This was a one byte heap buffer overflow triggered by a crafted regex using an illegal user defined Unicode property.

CVE-2024-56406: https://nvd.nist.gov/vuln/detail/cve-2024-56406
This was a heap buffer overflow in the tr// operator when the left side contained non-ASCII bytes, exploitable for denial of service or potential code execution.

CVE-2025-40909: https://nvd.nist.gov/vuln/detail/cve-2025-40909
This was a thread working directory race condition where file operations could resolve against the wrong path.

Switch and smartmatch are no longer enabled by newer feature bundles

Perl 5.36 removed the experimental switch feature from the default feature bundle. Code using given/when or smartmatch may no longer compile if it relies on a newer feature bundle to enable these features automatically.

incorrect:

use v5.36;

given ($state) {
when ("UP") { ... }
}

correct:

use v5.36;
use feature 'switch';

given ($state) {
when ("UP") { ... }
}

Reference:
https://perldoc.perl.org/perl5420delta#Switch-and-Smart-Match-operator-kept,-behind-a-feature

Reason:
Switch and smartmatch remain available in Perl 5.42, but they are no longer automatically enabled by modern feature bundles. Existing code should be reviewed to ensure it does not rely on implicit feature activation.

goto into an inner scope is deprecated

incorrect:

goto TARGET;

{
TARGET:
my $value = 1;
}

correct:

Refactor the control flow to avoid jumping into a lexical scope.

Reference:
https://perldoc.perl.org/perl5400delta#Deprecations

Reason:
Jumping from an outer scope into an inner scope is deprecated and scheduled for removal. Code relying on this behavior should be rewritten before future Perl upgrades.

Feature bundle behavior continues to change

incorrect:

use v5.42;

# Assumes older feature bundle behavior

correct:

Explicitly enable required features.

use v5.42;
use feature qw(switch);

Reference:
https://perldoc.perl.org/perl5420delta#Switch-and-Smart-Match-operator-kept,-behind-a-feature

Reason:
Feature bundles are not guaranteed to enable the same language features across releases. Explicit feature declarations are more reliable and make code behavior easier to understand.

Core module versions have changed significantly

Reference:
https://perldoc.perl.org/perl5420delta#Updated-Modules-and-Pragmata

Reason:
Many core modules have been upgraded between Perl 5.32 and Perl 5.42. Installation tools, build scripts, recovery kits, and third-party integrations should be tested against the updated module versions rather than assuming Perl 5.32 behavior.

New pragma source::encoding

Non-ASCII source validation is stricter

incorrect:

# Source file contains UTF-8 characters
# without explicitly declaring encoding



correct:

use utf8;

or

use source::encoding 'utf8';

Reference:
https://perldoc.perl.org/perl5420delta#New-pragma-source::encoding

Reason:
Perl 5.42 introduces additional source encoding validation. Projects containing UTF-8 source code should explicitly declare their encoding to avoid parsing and portability issues.

Deprecated constructs should be treated as defects

Reference:
https://perldoc.perl.org/perl5400delta#Deprecations

Reason:
Several legacy behaviors continue to move through the deprecation process. Warnings that are ignored today often become compilation failures in future releases.

A physically empty sort is now a compile time error

incorrect:
@a = sort;
@a = sort ();

correct:
@a = sort @list;     # sorting a real list is unaffected
@a = sort @empty;    # also fine, even when the array is empty

Reference:
https://perldoc.perl.org/perl5360delta#A-physically-empty-sort-is-now-a-compile-time-error

Reason:
A bare sort with no list used to be a way to produce an empty list. As of Perl 5.36 this will now croak at compile time. This change was made to free up syntax for future enhancements to sort.

Indirect object syntax is disabled by newer feature bundles

incorrect:
use v5.36;
my $obj = new Some::Class(@args);
correct:
use v5.36;
my $obj = Some::Class->new(@args);

Reference:
https://perldoc.perl.org/perl5360delta#use-v5.36

Reason:
The indirect and multidimensional features are now off by default. Code that uses indirect notation will no longer compile and must use arrow calls instead.

Feedback

Was this helpful?

Yes No
You indicated this topic was not helpful to you ...
Could you please leave a comment telling us why? Thank you!
Thanks for your feedback.

Post your comment on this topic.

Post Comment