1

一部の Perl モジュールは、次のようにハッシュ引数を使用してインポートされます。

use Test::Simple tests => 1

これは、文書化された使用法と一致しませんuse:

use Module VERSION LIST
use Module VERSION
use Module LIST
use Module
use VERSION

通常、特定のサブルーチンまたは変数名をパッケージにエイリアスすることにより、名前付きモジュールから現在のパッケージにいくつかのセマンティクスをインポートします。

私たちの場合、リストの代わりにハッシュを使用していますが、少なくとも意味論的には - もちろん、

use Test::Simple qw(tests 1)

は同等ですが、リストがインポートする名前のリストであることを期待している部外者には意味がありません。

この逸脱をどのように説明/擁護しますか? パラメータを使用してモジュールをインポートできるようにするのは、推奨される構文シュガーですか?

4

5 に答える 5

6

パーロップ

=> 演算子はカンマと同義ですが、文字またはアンダースコアで始まり、文字、数字、およびアンダースコアのみで構成されている場合、左側の単語が文字列として解釈される点が異なります。これには、そうでなければ演算子、定数、単一の数値 v-string、または関数呼び出しとして解釈される可能性のあるオペランドが含まれます。この動作について疑問がある場合は、左側のオペランドを明示的に引用できます。

それ以外の場合、=> 演算子は、コンテキストに応じて、コンマ演算子またはリスト引数セパレーターとまったく同じように動作します。

だからそれはuse Module LIST構文です

于 2013-10-29T11:40:25.950 に答える
5

まず、引用したドキュメントを読み直してください。

通常、特定のサブルーチンまたは変数名をパッケージにエイリアスすることにより、名前付きモジュールから現在のパッケージにいくつかのセマンティクスをインポートします。

サブのリストをインポートするだけではありません。


この逸脱をどのように説明/擁護しますか?

あなたは3つの逸脱について言及しました。

  1. =>ハッシュを示す信念。

    これは、ハッシュ初期化子のようなものがあるという誤解から生じています。Perl にはイニシャライザがないことを説明します。これは、LHS がor=であっても通常の代入を示します。ハッシュと配列は、データではなく変数の型です。%hashmy %hash

  2. 渡されるuse Test::Simpleリストは、インポートするシンボルのリストです。

    それがどのように問題なのかわかりません。もしそうなら、Test::Simple のドキュメントを参照することができます。

  3. 渡されるuse MODULEリストは、インポートするシンボルのリストです。

    一般的に使用されるコア モジュールの strict、warning、CGI、CGI::Carp、Test::More など、多くの反例があります。

いかなる逸脱も擁護されるべきではありません。これらは有用な比喩ではありません。

于 2013-10-29T14:02:52.113 に答える
3

おっしゃるとおり、これは該当するuse Module LIST部類に入ります。

use for の解釈方法を理解するための鍵は、次の行に変換されるLISTことを理解することだと思います。use Module LIST;

BEGIN { require Module; Module->import( LIST ); }

関連するパッケージにカスタムサブルーチンがあるため、モジュールを要素として処理しLISTてハッシュを設定しているように見えます。import

sub import {
    my($class) = shift;

    # Don't run all this when loading ourself.
    return 1 if $class eq 'Test::Builder::Module';

    my $test = $class->builder;

    my $caller = caller;

    $test->exported_to($caller);

    $class->import_extra( \@_ );
    my(@imports) = $class->_strip_imports( \@_ );

    $test->plan(@_);

    $class->export_to_level( 1, $class, @imports );
}

Test::Moreもこの「パターン」を利用しています。

于 2013-10-29T12:39:47.707 に答える
2

ikegami は、「この逸脱をどのように説明/擁護しますか?」と答える素晴らしい仕事をしています。(つまり、ここに偏差はありません)。

答えるには:「モジュールをパラメーター付きでインポートできるようにすることは、推奨される構文糖衣ですか?」

いいえ、汎用モジュールは通常、少なくとも構成設定についてはこれを避けるべきです。これは、機能を制御するモジュールでグローバル変数の設計を促進するためです。つまり、2 つの独立した他のモジュールは、問題のモジュールを異なる構成で使用することはできません。この誤用の例は、Math::BigInt (およびその仲間) です。

テスト モジュールは特殊なケースです。それらはメイン スクリプトによって (またはメイン スクリプトで使用されるモジュールのスーパークラスとして) 使用される可能性が高いため、私の異議は適用されません。

(確かに、モジュールは import に渡されるものをプラグマのようなレキシカル スコープにするか、特定の呼び出し元パッケージにバインドするという問題に直面する可能性がありますが、これら 2 つのオプションの効果はわずかに異なり、同じ呼び出し元が複数の構成を使用することを困難にするだけでなく、それらが異なる場合もあります)。

ほとんどの場合、OO インターフェイスをサポートし、そのような設定をインスタンス属性にする方がはるかに優れています。

于 2013-10-29T15:05:44.477 に答える
-1

記号はコンマ演算子と同じなので、この形式を使用するuse Test::Simple tests => 1のは Perl の通常の方法です。したがって、何かを行うための別の方法にすぎないのは、構文糖衣ではありません。TIMTOWTDI=>,

于 2013-10-29T11:41:11.783 に答える