LifeKeeper for Windows v 8.10.1リリースには、5.8.8から5.32.1にアップグレードされたPerlバージョンが含まれています。新バージョンには多くの新機能と強化があります。5.32.1の新機能は perldoc documentation にあります。より簡潔なPerl 5の歴史については、 Perl 5 version history – Wikipedia を参照してください。これらの機能強化により、Perl 5.32.1は多くのバグを修正し、Perlコミュニティが従うべきコーディングプラクティスを強化しました。ここでは、信頼性の高いコードのために従うべきいくつかのベストプラクティスと、Perl 5.8.8からPerl 5.32.1への移行時に注意すべきこと、または避けるべきことについて説明します。
すべてのコードには次のものが必要です。
use strict;
use warnings;
これらは、ほぼすべてのエラーまたは疑わしいコードを指摘します。その一部は過去には機能していた可能性がありますが、Perl 5.8.8では非推奨となり、Perl 5.32では機能しなくなります。
no warnings ‘uninitialized’;
no warnings ‘uninitialized’ プラグマでは、 undef の使用が許可されています。これは通常の Perl スタイルであり、不必要に制限する必要はありません。 追加の no warnings プラグマは、コードの変更が危険または負担が大きすぎるレガシーコードで使用される場合があります (「警告なし」は可能な限り回避する必要があります)。
LifeKeeper Perlの警告 (v8.10.1)
LifeKeeper for Windows v8.10.1へのアップグレード後、アプリケーションのグラフィカルユーザーインターフェイスに「初期化されていない変数メッセージ」の警告が表示されるシナリオが3つあります。
これはLifeKeeper for Windowsの以前のバージョンには存在せず、Perl 5.32.1で初期化されていない変数をより厳密に処理したために発生しました(上記を参照)。
SIOSは、次のリリースでこれらの問題を軽減するために取り組みますが、それまでの間、次のシナリオで 「初期化されていない変数メッセージ」 の警告が視覚的に表示されることが予想されます。
- Oracle PDB Resource Creation
- AWS ECC-Instance Switchover
- Reordering of Resource Priorities
警告メッセージは、実行されたアクションの結果には影響しませんが、視覚的にわかりやすくなります。
カスタムPerlスクリプトを移行するユーザーの場合
以下は、以前は機能していたかもしれないが、Perl 5.32では警告やエラーが発生したり、まったく正しく機能しなくなったりするコードの一般的な例です。 “use strict” と “use warnings” が有効になっている限り、以下にリストされているものはすべて、Perl 5.32では警告またはエラーメッセージを表示します (これらの一部は Perl 5.8.8でも警告を生成します)。
Implicit split into @_ - no longer works (must be fixed)
Incorrect: map { split /\001/; $_[3] }
Correct: map { @_ = split /\001/; $_[3] }
Incorrect: split /\001/, $ins;
Correct: @_ = split /\001/, $ins;
@_ は分割によって自動的に設定されなくなったため、暗黙的な分割を修正する必要があります。
Don’t use defined with hashes and arrays - no longer works (must be fixed)
Incorrect: if (defined(%hash))
Correct: if (%hash)
Incorrect: if (defined(@array))
Correct: if (@array)
Defined はハッシュと配列では機能しなくなりました。 ほとんどの場合、実行したいチェックは単純な “if” チェックです。
@INC perl include path no longer automatically includes “.”
Incorrect: my $rule = do ‘t/test.rule’;
Correct: my $rule = do ‘./t/test.rule’;
相対パスのインクルードには明示的に “.” を指定する必要があります。 (すでに @INC に手動で “.” を入力している場合を除く)。
Variable declarations require package names or scope specifiers.
Incorrect: @ISA = qw(RKBase);
Correct: our @ISA = qw(RKBase);
Correct: @NASBase::ISA = qw(RKBase);
Even Better: use parent ‘RKBase’; # (from Perl 5.10 onward, this is the preferred method for doing the above @ISA setting)
上記では、 @ISA はグローバルであり、グローバルであることを指定するための指定子、または明示的なパッケージ名のいずれかが必要です。
Hashes cannot be used as references
Incorrect: %$QueueManagers->{$qmgr}
Correct: $QueueManagers->{$qmgr}
上記では、$QueueManagers がハッシュ参照である場合、% は不要なため、Perlで警告が発生します。
Perl switchモジュールは非推奨Switch.pm モジュールは、Perl 5.12以降、Perlの標準ディストリビューションから削除されました。 詳細については、次の記事の “Deprecations(非推奨)” セクションを参照してください。 http://www.perl.com/pub/2010/04/inside-perl-512.html
Perl switch ステートメントは非推奨となり、LifeKeeper v8.10.1以降、Steeye Perlモジュールには Switchモジュールは提供されません。 switchステートメントの代わりに if/then/elsif ブロックを使用することを検討してください。
Perlのkeysルーチンはランダムな順序でキーを返します
Perl の keysルーチンは、ランダムな順序 (セキュリティ上の懸念から5.18.0以降) でハッシュ内のキー (keys %hash) を返します。順序が必要な場合は、sortなどのルーチンを使用してコード内に明示的に実装する必要があります。
このトピックへフィードバック