最大の意図的な非互換性の 1 つは、Perl 4 と Perl 5 の間で変更された配列補間です。
my @example = qw(1 2 3);
print "foo@example.com";
Perl 4 では、次のようになります。
foo@example.com
Perl 5 では、次のようになります。
foo1 2 3.com
幸いなことに、配列が存在しない場合、Perl は「意図しない補間の可能性」について警告します。
スレッドは 5.005 と 5.6 の間で大きな変更を受けました。「5005 スレッド」では、すべてのグローバル データが共有される従来の POSIX スレッド モデルが使用されました。理論的にはこれは高速でしたが、Perl は POSIX スレッドを使用できるため、Perl コーダーにとっては悪夢でした。ほとんどの Perl モジュールはスレッドセーフではありませんでした。そして、それは決してうまくいきませんでした。
5.6 では ActiveState などが Windows で fork() を作成しました。Windows で fork() を実行すると、Perl はインタープリター オブジェクトのコピーを作成し、両方のインタープリターのオペコードを実行します。これは「多様性」として知られていました。
5.8 では、Arthur Bergman がそれを実行し、それを使用して ithread を作成しました。多重度は別のプロセスをエミュレートしているため、デフォルトではデータは共有されません。あなたが共有すると言っているデータだけが共有されます。これにより、ithreads が安定するまでには長い時間がかかりましたが、より安全に使用できます。エリザベス・マティセンやジェリー・ヘデンのような人々がそれを実現させました.
5005 スレッドが 5.10.0 で最終的に削除されました。互換性レイヤーは存在しますが、実際に製品コードで機能するとは思えません。
もう 1 つの大きな非互換性は、5.6 と 5.8 の間の Unicode で発生しました。5.6 の Unicode が吹き飛ばされました。文字列が Unicode であるかどうかは、周囲のスコープによって決定されました。これは 5.8 で完全に再設計されたため、文字列の Unicode 性は文字列に関連付けられています。5.6 の Unicode を使用して書かれたコードは、通常、5.8 で書き直さなければなりませんでした。これは、多くの場合、5.6 の Unicode を正しく動作させるために、醜いハックを行わなければならなかったためです。
最近、5.10.1 はスマートマッチに互換性のない変更を加えました。幸いなことに、それらは 5.10.0 で導入されたので、大したことではありません。Perl 6 でスマート マッチの概念が導入され、Perl 5 の開発バージョンにバックポートされました。時間が経ち、Perl 6 のスマート マッチの概念が変わりました。Perl 5 の担当者には誰も知らせず、5.10.0 で変更されずに終了しました。 Larry Wall はそれに気づき、OMG YER DOIN IT WRONG と同等のことをしました!!! 新しい Perl 6 バージョンは大幅に改善されていると見なされたため、5.10.1 で修正されました。