12

Perl 1.0 の最初の公開リリース (1987 年 12 月 18 日) から現在の安定版リリース 5.10.1 (2009 年) まで 22 年が経過しました。

この 22 年間に、次の注目すべきリリースが行われました。

  • Perl 1.0 (1987 年 - 初期リリース)
  • Perl 2 (1988 年 - より良い正規表現)
  • Perl 3 (1989 - バイナリ データ ストリームのサポート)
  • Perl 4 (1991 - Camel Book に記載されている Perl のバージョンを特定)
  • Perl 5 (1994 年 - 主要な変更が導入され、インタプリタがほぼ完全に書き直されました)
  • Perl 5.6 (2000 - 64 ビットのサポート、Unicode 文字列、大きなファイルのサポート)
  • Perl 5.8 (2002 - Unicode サポートの改善、新しい IO 実装)
  • Perl 5.10 (2007 - 新しい switch ステートメント、正規表現の更新、スマート マッチ演算子)

Perl の歴史における下位互換性の具体例を探しています。

質問:

  • Perl の 22 年の歴史の中で、Perl バージョン X を対象とする Perl ソース コードがバージョン Y (Y > X) で実行されない、Perl 後方非互換性の例はありますか?

可能であれば、参照とコード例を含めてください。

4

5 に答える 5

14

最大の意図的な非互換性の 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 で修正されました。

于 2009-12-06T21:33:26.180 に答える
12

疑似ハッシュは、私の頭に浮かんだ最近の例です。一般に、perldelta ファイルには、特定のバージョンにおける互換性のない変更の概要が含まれています。これらの変更は、ほとんどの場合、(疑似ハッシュのように) あいまいであるか、小さいものです。

于 2009-12-06T14:28:43.713 に答える
11

はい。多くありますが、通常はマイナーです。場合によっては、これは非推奨サイクルが原因で、最終的には削除されることがあります。新しい (および実験的な) 機能のセマンティクスの変更が原因である場合があります。正しく動作しなかったもののバグ修正である場合もあります。Perl 開発者は、可能な限りバージョン間の後方互換性を維持するために多大な労力を費やしています。新しいバージョンの Perl にアップグレードしたことで壊れたスクリプトがあったことを思い出すことはできません。

内部ハッシュの順序は数回変更されています。これは依存すべきものではありませんが、無意識のうちに依存すると問題が発生する可能性があります。

メジャー (5.x) リリース間のバイナリ非互換性は一般的ですが、これは通常、XS 拡張機能を再コンパイルする必要があることを意味します。

完全なリストは、ここにリストするには長すぎます。各バージョンの履歴の「互換性のない変更」セクションを確認することで取得できます。

于 2009-12-06T14:29:47.690 に答える
5

OTOH には、Perl 1 にさかのぼるワイルドな機能がまだいくつかあります。たとえば、これは何を印刷しますか?

%foo = (foo => 23);
print values foo

そうです、23歳です。なぜですか?「連想配列」は Perl 1. では第一級のオブジェクトで $foo{bar}はなかったため、 は機能しましたが、. はありませんでし%fooた。Perl 1 の man ページでさえ、これが狡猾であることを認めているので、その理由は本当にわかりません。したがって、Perl 1 との互換性のために%、おそらくキーボードが壊れているか、Apple が%シンボルを使用していないと判断した場合に、 を使用せずにグローバル ハッシュにアクセスできます。

chdirいくつかの奇妙な点があります。 chdir()引数を指定しないと、ホーム ディレクトリに移動し、シェルのcd動作が複製されます。残念ながら、そのようになりchdir undefchdir ""周りのエラーを見つけるのが難しくなりchdirます。幸いなことに、この動作は非推奨です。5.14で確実に死ぬようにする必要があります。

$[まだ存在しており、非推奨のままですが、「非常に推奨されていません」。配列の最初のインデックスが何であるかを変更するので、あなたが私のような人間で、1 から数える場合は次のようにできます。

$[ = 1;
@foo = qw(foo bar baz);
print $foo[2];   # prints bar

Perl 5 では、ファイル スコープに変更されました。それ以外の場合は、パフォーマンスの低下と CrAzY の優れたソースでした。

于 2009-12-07T02:15:27.193 に答える
3

Perl4 と Perl5 で代入の左辺と右辺を異なる順序で評価し、不注意のPerl トラップを引用すると、いくつかのファンキーなエラーが発生しました。

代入演算子の LHS と RHS。LHS は perl4 で最初に評価され、perl5 で 2 番目に評価されます。これは、サブ式の副作用間の関係に影響を与える可能性があります。

@arr = ( 'left', 'right' );
$a{shift @arr} = shift @arr;
print join( ' ', keys %a );
# perl4 prints: left
# perl5 prints: right

互換性のない新しいものについては、 Perl4 と Perl5 の間の FAQを参照してください。

于 2009-12-10T17:12:08.577 に答える