3

ここで何が起こるかわかりません:

use PAR { file => 'foo.par', fallback => 1 };

それは匿名ハッシュだと思います。モジュールはラインからどのように使用していuseますか? 光を当てることができますか?

編集: PAR モジュールには興味がありません。私はそれがカーテンの後ろでどのように機能するかに興味があります. モジュールをそのように構成するにはどうすればよいですか?

4

5 に答える 5

7

useモジュールの場合、引数のリストを渡すことができます。あなたの例(タイプミスがあり、閉じ引用符が欠落しているようです)では、1つの要素(ハッシュ参照)を持つリストが渡されます。

より一般的に:

use Module LIST

これになります:

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

このBEGINブロックにより、すべてがコンパイル時に行われることが保証されます。requireモジュールがまだ存在しない場合は、モジュールをメモリにロードします。そして、モジュールのメソッドは、元のステートメントでimport()(として) 渡された引数を使用して呼び出されます。LISTuse

独自のモジュールでこのような引数を使用して何かを実行するにはLIST、モジュールでメソッドを定義する必要がありますimport()。多くのモジュールはそれを行いません。むしろ、クラスimport()から継承します。Exporter詳細については、 perldoc -f の使用を参照してください。

モジュールが独自のimport()メソッドを定義している場合は、自分でシンボルをクライアント コードにエクスポートするか、より一般的にはexport_to_level()によって提供されるメソッドを使用する必要がありますExporter。このメソッドの最初の引数は、シンボルをエクスポートするコール スタックのレベルを指定する正の整数です。最も一般的な値 1 は、現在のパッケージの 1 レベル、つまり、モジュールを使用しているクライアント コードにシンボルをエクスポートすることを意味します。import()メソッドで実行する必要がある処理の概要を次に示します。

sub import {
    my ($class, @args) = @_;

    # Do whatever you need to do with the LIST of arguments
    # supplied by the client code using your module.


    # Let Exporter do its normal work of exporting symbols
    # into the client code using your module.
    $class->export_to_level(1, @_);
}
于 2009-09-04T21:48:23.643 に答える
7

より基本的には、これはおかしな hashref 構文が行うことです ( perldoc -f useを参照として使用):

この基本モジュールがあるとFoo.pmします (現在のディレクトリに配置します)。

package Foo;

use Data::Dumper;
sub import
{
    print "import was passed these arguments: ". Dumper(\@_);
}

1;

を呼び出すperl -I. -wle'use Foo { a => 1, b => 2}'と、コードFoo->import({a=>1, b=>2})が実行されます。したがって、これが出力として得られるものです。

import was passed these arguments: $VAR1 = [
          'Foo',
          {
            'a' => 1,
            'b' => 2
          }
        ];

基本的に、この構文ではExporterを使ってマジックを行うことができますが、実際には好きなことをimport()何でも行うことができます (混乱を招かないように、しっかりと文書化してください!)

于 2009-09-04T21:43:21.187 に答える
2

はい、それは匿名ハッシュです。modules メソッドに引数として渡されますimport

于 2009-09-04T21:49:29.787 に答える
0

あなたの質問への直接の答え: PAR はこれを行います (340 行目) :

# called on "use PAR"
sub import {
    my $class = shift;
    [...]
    my @args = @_;
    [...]
    # process args to use PAR 'foo.par', { opts }, ...;
    foreach my $par (@args) {
        if (ref($par) eq 'HASH') { # <---- This is what handle's your case!
            # we have been passed a hash reference
            _import_hash_ref($par);
        }
        elsif ($par =~ /[?*{}\[\]]/) {
           # implement globbing for PAR archives
           [...]
        }
        else {
            # ordinary string argument => file
            [...]
        }
    }

残念ながら、そこで実際に何が起こっているのかを掘り下げてみると、学ぶべき例として CPAN の最も複雑なモジュールの 1 つを選んだことに気付くでしょう。代わりにモジュール。モジュールを「使用」して use ステートメントに引数を指定すると、perl はモジュールをロードし、引数のリストを指定して「インポート」メソッドを呼び出します。

あなたの例では、引数は 1 つだけです。ハッシュへの参照です。{key=>"value",key2=>"value2",...} 構文は、匿名ハッシュのコンストラクターです。これらはperlref マニュアルページに文書化されていますが、perlreftut チュートリアルでより分かりやすい用語で説明されています。

于 2009-09-04T22:25:37.350 に答える
0

PAR は CPAN モジュールのPerl Archive Toolkitです。hashref は、PAR に渡される構成パラメーターです。

コード:

use PAR { file => 'foo.par, fallback => 1 };
use Foo::Bar;

利用可能な場合は使用することを意味しますが、それ以外の場合は、アーカイブ " " (おそらく のアーカイブ バージョンを保持している) を使用Foo::Barするようにフォールバックします。foo.parFoo::Bar

于 2009-09-04T21:18:44.810 に答える