LifeKeeperリリース10.1では、同梱されているPerlランタイムがバージョン 5.32.1 から 5.42.0 にアップグレードされました。このアップグレードは、Perl 5.34、5.36、5.38、5.40、5.42の各リリースシリーズにまたがるものです。これらのバージョンの公式リリースノートは、Perlプロジェクトのサイトで公開されています。
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
本ガイドは、SIOS LifeKeeper Generic Application (GenApp) リソースでPerlプログラミング言語を使用するお客様が留意すべき点について、理解を深めていただくことを目的としています。
現在、Perl 5.32で「use strict」および「use warnings」を有効にした状態で問題なく実行されているLifeKeeperのPerlコードのほとんどは、Perl 5.42でも引き続き正常に動作すると予想されます。移行に伴う主なリスクとしては、診断機能や非推奨機能の変更、バンドルされているモジュールのバージョンの変更、およびレガシーコードによる前提条件の変更などが挙げられます。
Perl 5.34から5.42までのリリースサイクルを通じて、実験的な言語機能が継続的に導入されてきました。Perl 5.34では実験的なtry/catch構文のサポートが導入されました (https://perldoc.perl.org/perl5340delta#Experimental-Try/Catch-Syntax )。一方Perl 5.42では、レキシカルメソッドやメソッド呼び出しの機能強化など、新たなオブジェクト指向言語機能が追加されています(https://perldoc.perl.org/perl5420delta#Lexical-method-declaration-using-my-method )。
これらの機能は現在LifeKeeperでは使用されていません。特定の要件があり、かつ十分なテストが実施されている場合を除き、原則として使用を避けるべきです。
Perlに同梱されているモジュールは、5.32から5.42までの各リリースで更新されています。バンドルされているCPANモジュール、Recovery Kitのコード、インストールユーティリティ、ビルドスクリプト、サードパーティ製品の統合機能などは、更新されたランタイム環境で動作検証を行う必要があります。互換性の問題を調査する際には、各バージョンのperldeltaキュメントに記載されているモジュールの更新リストを参照してください。
ハッシュの順序は不定であり、アプリケーションロジックにおいてその順序に依存すべきではありません。安定した順序を必要とするコードでは、処理を行う前にキーを明示的にソートする必要があります。
テスト中に表示された非推奨に関する警告は、すべて不具合として扱う必要があります。Perlでは、これまで下位互換性のために維持されてきた従来の動作の削除や制限が継続的に行われています。移行中に発生した警告や実行時のエラーを調査する際は、各perldeltaドキュメントの「非推奨」および「非互換性」に関する公式のセクションを確認してください。
ロジックや構文の変更に加え、多数のCVE(共通脆弱性識別子)への対応および修正が行われました。LifeKeeper for Windowsに影響を及ぼしたCVEは以下の通りです。
CVE-2023-47038: https://nvd.nist.gov/vuln/detail/cve-2023-47038
不正なユーザー定義のUnicodeプロパティを使用した、細工された正規表現によって引き起こされた1バイトのヒープバッファオーバーフロー。
CVE-2024-56406: https://nvd.nist.gov/vuln/detail/cve-2024-56406
tr//演算子の左辺に非ASCIIバイトが含まれている場合に発生するヒープバッファオーバーフローであり、サービス拒否やコード実行の可能性がある脆弱性。
CVE-2025-40909: https://nvd.nist.gov/vuln/detail/cve-2025-40909
ファイル操作が誤ったパスに対して解決されてしまう可能性のある、スレッドの作業ディレクトリにおける競合状態。
CVE-2023-47039: https://nvd.nist.gov/vuln/detail/cve-2023-47039
これは、Windowsのバイナリハイジャック脆弱性であり、Perlがシステムパスよりも先に現在の作業ディレクトリー内でcmd.exeを検索してしまうため、権限の低い攻撃者が悪意のあるcmd.exeを組み込み、後で実行させることが可能となるものでした。
新しい機能バンドルでは、「switch」および「smartmatch」は有効化されなくなりました
Perl 5.36では、実験的な機能である「switch」がデフォルトの機能バンドルから削除されました。「given/when」や「smartmatch」を使用しているコードにおいて、これらの機能を自動的に有効化するために新しい機能バンドルに依存している場合、コンパイルできなくなる可能性があります
incorrect:
use v5.36;
given ($state) {
when ("UP") { ... }
}
correct:
use v5.36;
use feature 'switch';
given ($state) {
when ("UP") { ... }
}
参考:
https://perldoc.perl.org/perl5420delta#Switch-and-Smart-Match-operator-kept,-behind-a-feature
理由:
Perl 5.42では「switch」および「smartmatch」は引き続き利用可能ですが、最新の機能バンドルでは自動的に有効化されなくなりました。既存のコードが、機能の暗黙的な有効化に依存していないか確認してください。
内側のスコープへのgotoは非推奨です
incorrect:
goto TARGET;
{
TARGET:
my $value = 1;
}
correct:
Refactor the control flow to avoid jumping into a lexical scope.
参考:
https://perldoc.perl.org/perl5400delta#Deprecations
理由:
外側のスコープから内側のスコープへのジャンプは非推奨となっており、将来的に削除される予定です。この挙動に依存しているコードは、今後のPerlのアップグレードに先立って書き換える必要があります。
機能バンドルの動作は継続的に変更されます
incorrect:
use v5.42;
# Assumes older feature bundle behavior
correct:
Explicitly enable required features.
use v5.42;
use feature qw(switch);
参考:
https://perldoc.perl.org/perl5420delta#Switch-and-Smart-Match-operator-kept,-behind-a-feature
理由:
機能バンドルでは、リリース間で同じ言語機能が有効になることは保証されません。明示的な機能宣言の方が信頼性が高く、コードの挙動を理解しやすくなります。
コアモジュールのバージョンが大幅に変更されました
参考:
https://perldoc.perl.org/perl5420delta#Updated-Modules-and-Pragmata
理由:
Perl 5.32からPerl 5.42の間で、多くのコアモジュールがアップグレードされています。インストールツール、ビルドスクリプト、Recovery Kit、サードパーティ製品との連携機能については、Perl 5.32での動作を前提とするのではなく、更新されたモジュールバージョンに対してテストを行う必要があります。
新規プラグマ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';
参考:
https://perldoc.perl.org/perl5420delta#New-pragma-source::encoding
理由:
Perl 5.42では、ソースコードのエンコーディングの検証機能が追加されます。UTF-8のソースコードを含むプロジェクトでは、解析や移植性に関する問題を回避するため、エンコーディングを明示的に宣言する必要があります。
非推奨の構成要素は不具合として扱うべきです
参考:
https://perldoc.perl.org/perl5400delta#Deprecations
理由:
従来の挙動のいくつかは、現在も非推奨化のプロセスが進められています。現在無視されている警告は、将来のリリースでは多くの場合コンパイルエラーとなります。
引数を持たないsortは、コンパイル時にエラーになります
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
参考:
https://perldoc.perl.org/perl5360delta#A-physically-empty-sort-is-now-a-compile-time-error
理由:
以前は、リストを指定しない単独のsortにより、空のリストを生成することができましたが、Perl 5.36以降ではコンパイル時にエラー(croak)が発生するようになりました。この変更は、将来的なsortの機能強化に向けて構文の余地を確保することを目的としています。
新しい機能バンドルにより、間接オブジェクト構文が無効化されました
incorrect:
use v5.36;
my $obj = new Some::Class(@args);
correct:
use v5.36;
my $obj = Some::Class->new(@args);
参考:
https://perldoc.perl.org/perl5360delta#use-v5.36
理由:
間接オブジェクト構文 および多次元配列に関する機能は、デフォルトで無効になっています。間接記法を使用しているコードはコンパイルできなくなるため、代わりにアロー演算子を使用した呼び出しに変更する必要があります。



このトピックへフィードバック