2009-09-04 8 views
3

私はここで何が起こるかを理解していない:これらのPerl使用行はどうなりますか?

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

私は無名ハッシュだと思います。 use行のモジュールはどのように使用していますか?あなたは光を放つことができますか?

EDIT:私はPARモジュールに興味がありません。私はそれがカーテンの後ろでどのように働くかに興味があります。私のようなモジュールをどうすれば設定できますか?

答えて

7

より基本的に、これは面白いハッシュリファレンスの構文は(参照としてperldoc -f useを使用して)何をするかです:

package Foo; 

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

1; 

たちは、この基本モジュールを(現在のディレクトリにFoo.pmに入れ)持っていると言います

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()はあなたが好きな何かを行うことができます(ちょうどそうしないために多額の文書化するようにしてください混乱の原因になります)

0

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

コードは:

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

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

+0

ああ。ごめんなさい。私はその構文が機能することを許すものは理解していません。私はPARモジュールには興味がありません。著者がそれを可能にした方法です。 – Geo

+0

ハ!その場合、私はちょうどあなたの質問に本当の答えを提供しました。 :) – Ether

7

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

use Module LIST 

はこのようになります。

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

BEGINブロックは、もののすべてがコンパイル時に起こることを保証します。 requireは、まだモジュールがない場合、モジュールをメモリにロードします。そして、モジュールのimport()メソッドは、元のuseステートメントで渡された引数(LISTなど)と一緒に呼び出されます。

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

あなたのモジュールは、独自のimport()メソッドが定義されている場合は、クライアントコードに自分自身をシンボルをエクスポートする必要があるか、より一般的に、Exporterによって提供さexport_to_level()メソッドを使用しますか。このメソッドの最初の引数は、シンボルをエクスポートする呼び出しスタック内のレベルを指定する正の整数です。 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, @_); 
} 
2

はい、これは匿名のハッシュです。これは引数としてモジュールimportメソッドに渡されます。あなたの質問へ

0

直接答えは:PARはthis (line 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で最も複雑なモジュールの一つを選んだ実現しますから学ぶ例として、fine documentation on modules insteadをご覧ください。何を探すべきかを知るために:モジュールを "使用"してuse文に引数を渡すと、perlはモジュールをロードし、引数のリストで "import"メソッドを呼び出します。

例の場合、単純に1つの引数があります。ハッシュへの参照です。 {key => "value"、key2 = "" value2 "、...}構文は、匿名ハッシュのコンストラクタです。これらはthe perlref manual pageに記載されていますが、the perlreftut tutorialではよりフレンドリな用語で説明されています。

関連する問題