質問

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 の下位互換性の例はありますか?

可能であれば、参考文献やコード例を含めてください。

役に立ちましたか?

解決

の最大の意図的な非互換性の一つは、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上でフォーク()を作りました。 Windows上で()をフォークすると、Perlはインタプリタオブジェクトのコピーを作成し、両方の通訳のオペコードを実行します。これは、「多重度」として知られていました。

5.8では、アーサー・バーグマンはそれで走ったとiスレッドを作成するためにそれを使用しました。多重度は別のプロセスをエミュレートしているので、データはデフォルトで共有されていません。あなたが共有されていると言うだけのデータが共有されています。 iスレッドが安定していた前に、それは長い時間がかかったが、これは、それらを使用するはるかに安全になります。エリザベスMattijsenとジェリーHeddenのような人々は、それが起こる作られています。

5005threadsは、最終的には5.10.0に抹消されました。互換性レイヤが存在しますが、私はそれが本当に生産コードでは動作しないだろう。

もう一つの大きな非互換性は、5.6と5.8の間のWRT Unicodeを来ました。 5.6でのUnicodeが吹きました。かどうかは、文字列はUnicodeが、周囲のスコープによって決定しました。それは完全に今、文字列のUnicodeinessを文字列に結合されている5.8に再設計されました。 5.6のUnicodeを使用して書かれたコードは、通常、5.6のUnicodeはあなたが醜いハックをしなければならなかったの権利を動作させるためにしばしばあるため、5.8で書き直さなければならなかった。

最近、5.10.1はスマートマッチに互換性のない変更の束を作りました。幸いなことに、彼らはそうではないその大した5.10.0で導入されました。 Perl 6の存在である物語は、スマートマッチ概念を導入し、それはPerlの5時間の開発バージョンにバックポートして渡され、そしてスマートマッチングのPerl 6のの考えが変わりました。誰もPerlの5人を語っていないし、それがそのまま5.10.0に出かけました。 Larry Wall氏は気づいたとOMGの同等をしましたYERそれは間違ってdoinの!!!新しいPerl 6のバージョンは、のように有意に良好に見られたとそう5.10.1はそれを修正します。

他のヒント

の最近の例であること私の心に春。一般的には、 perldeltaファイルが特定のバージョンで互換性のない変更点の概要を説明してい。ほとんどの場合、これらの変更のいずれか不明瞭または小(擬似ハッシュなど)。

はい。彼らは通常、マイナーだが、多くあります。時には、これは最終的に除去で終わる廃止サイクルによるものです。時にはそれは、新しい(そして実験的な)機能のセマンティクスを変更することに起因するのです。時にはそれが正常に動作しませんでした物事のためのバグ修正です。 Perl開発者は、可能な限りバージョン間の下位互換性を維持するために苦心を取ります。私は、Perlの新しいバージョンにアップグレードすることで壊れていたスクリプトを持つ、これまで思い出すことができない。

内部ハッシュ順序が数回変更されました。これはあなたが依存すべきものではありませんが、あなたが無意識のうちにやるならば、それは問題を引き起こす可能性があります。

メジャー(5.xの)リリース間のバイナリ互換性が一般的ですが、それは通常、ただのXSエクステンションを再コンパイルする必要があることを意味します。

の完全なリストは、ここに一覧表示するにはあまりにも長いです。あなたは、各バージョンの歴史での「互換性のない変更点」セクションをチェックして、それを得ることができます。

大藤まだ動作バック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で死ぬことを確認する必要があります。

$[はまだ残っているとundeprecatedままですが、「非常に落胆します」。これは、配列の最初のインデックスが何であるか変わるので、あなたは私のような人間だと1から数える場合は行うことができます:

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

のPerl 5は、それ以外の場合は性能ドラッグと狂気の大きな原因であったように、ファイルスコープであることがそれを変更します。

私は<のhref = "http://www.perl.com/doc/manual/を引用し、異なる順序で割り当ての左手と右手の側面を評価するのPerl4とPerl5のといくつかのファンキーなエラーを持っていました不注意のためのHTML /ポッド/ perltrap.html」のrel = "nofollowをnoreferrer"> Perlの罠ます:

  

LHS任意の代入演算子のRHS対。 LHSはperl5の第二、のPerl4で最初に評価されます。これは、サブ式での副作用との関係に影響を与えることができます。

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

いくつかの新しいと互換性のないものについては、を見ますPerl4のとPerl5の間のよくある質問でます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top