9

use VERSION構文の必要性とpackage NAME VERSIONPerl 5.12 で導入された構文について混乱しています。両方を指定する必要があると予想しました:

use v5.12;

package MyPackage 0.01;

私が見た例はすべてこのように見えます。しかし、偶然 (つまり、注意を払わずにコピー & ペーストした)、この新しいパッケージ バージョンの構文は、use 5.010バージョンが指定されているか指定されていない場合でも機能することがわかりました。

ベースとなる Perl のインストールは ActiveState 5.14 です。この場合、必要なのはインタープリターのバージョンだけですか? use VERSION下位互換性を維持するために、新しい機能には常に構文が必要であるという印象を受けました。例外はありますか?

4

2 に答える 2

11

すべての新機能がfeature.

use VERSION構文はこれを行います:

  • 現在の perl バージョンが低すぎる場合にエラーをスローします。
  • featureプラグマから適切な機能セットをインポートします。featureリストの私のバージョンの perldoc ページ:

    bundle    features included
    --------- -----------------
    :default  array_base
    
    :5.10     say state switch array_base
    
    :5.12     say state switch unicode_strings array_base
    
    :5.14     say state switch unicode_strings array_base
    
    :5.16     say state switch unicode_strings
               unicode_eval evalbytes current_sub fc
    

    (実際にarray_baseは、5.16 で導入されましたが、後方互換性のために以前のバンドルに追加されました)。

  • 5.11.0 以降、strictプラグマは現在のスコープで有効化されています。

一部の変更は後方互換性が非常に高いため、非アクティブ化する方法を提供する必要はありません (これがfeatureプラグマの目的です)。構文は主use MODULE VERSIONに下位互換性があります。のバージョンとインポート リストの間にカンマがないため、

use MODULE VERSION LIST;

これは問題ではありません (つまり、この構文は以前は違法でした)。LISTが欠落している場合、importメソッドはこの構文を認識しない perl でバージョン番号を受け取ります。モジュールはこのExporterケースを処理し、モジュールのバージョンをチェックします。そのため、via Exporter (大部分) を提供するすべてのモジュールimportは安全です。

于 2013-05-22T13:36:44.343 に答える
4

use VERSIONで明示的にオンにできるすべてのものを提供し、use feature現在のバージョンが必要なものよりも低い場合は文句を言います。このドキュメントを参照してください: http://perldoc.perl.org/functions/use.html

VERSION が現在の Perl インタープリターのバージョンより大きい場合、例外が発生します。Perl はファイルの残りを解析しようとはしません。

[..]

use VERSIONまた、プラグマで定義されているように、要求されたバージョンで使用可能なすべての機能を有効にし、要求されたfeatureバージョンの機能バンドルに含まれていない機能を無効にします。機能を参照してください。同様に、指定された Perl のバージョンが 5.11.0 以上の場合、 use strict と同様に、制限が字句的に有効になります。use strictまたはの明示的な使用 (それno strictuse VERSION前にある場合でも)。どちらの場合も、feature.pm ファイルと strict.pm ファイルは実際には読み込まれません。

特定の関数の動作、正規表現修飾子、およびperldeltaで説明されているその他のもののように、変更されるだけのものは、これとは何の関係もありません。perl インタープリターにはないため、強制的に以前のバージョンの動作に戻すことはできません。


本番環境でこの問題が発生した例として、/r正規表現の修飾子があります。これはPerl 5.14.0で導入されました。5.12 で使用すると、構文エラーが発生します。5.14 で実行するとすぐに、次のようなプログラムでも動作します。

#!/usr/bin/perl
use strict; use warnings;
my $foo = 'foobar';
print $foo =~ s/foo/oof/r;
于 2013-05-22T13:32:30.910 に答える