これらの Perl 使用行では何が起こるでしょうか?
-
21-09-2019 - |
質問
ここで何が起こっているのか理解できません:
use PAR { file => 'foo.par', fallback => 1 };
匿名ハッシュだと思います。モジュールがそれをどのように使用しているか use
ライン?光を当ててもらえますか?
編集:PARモジュールには興味がありません。カーテンの裏側でそれがどのように機能するかに興味があります。モジュールをそのように構成するにはどうすればよいですか?
解決
もっと基本的に、これは面白いハッシュリファレンスの構文ははperldoc -f使用を使用して(何でありますA>基準として)
と言うが、私たちは、この基本モジュールを持っている(現在のディレクトリに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
}
];
基本的には、この構文は、私たちは輸出するで魔法を行うが、真実にあなたができることができますimport()
あなたのような何かを作る(ただ混乱の原因ではないのと重くので、文書にしてください!)
他のヒント
use
すると、あなたはそれに引数のリストを渡すことができます。あなたの例では(タイプミスを持っていると思われ、終了引用符が欠落しているもの)を、一つの要素(ハッシュ参照)とのリストが渡されます。
より一般的には:
use Module LIST
は、このようになります。
BEGIN {
require Module;
Module->import( LIST );
}
もののすべてがコンパイル時に起こることを BEGIN
ブロック保証します。それはまだ存在しないかどうrequire
は、メモリにモジュールをロードします。そして、モジュールのimport()
方法は、元のLIST
文で(use
として)渡されたどんな引数で呼び出されます。
は、引数のように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, @_);
}
はい、それは無名ハッシュです。これは、モジュールimport
メソッドに引数として渡されます。
PARはCPANモジュール Perlのアーカイブツールキットのです。ハッシュリファレンスは、PARに渡される設定パラメータです。
コード
use PAR { file => 'foo.par, fallback => 1 };
use Foo::Bar;
使用Foo::Bar
への手段が使用可能な場合、それ以外は、アーカイブ(おそらくfoo.par
のアーカイブされたバージョンを保持している)「Foo::Bar
」を使用するようにフォールバックします。
あなたの質問に対する直接の答え: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 はモジュールをロードし、引数のリストを使用してその「import」メソッドを呼び出します。
あなたの例のケースでは、引数が 1 つだけあります。ハッシュへの参照。{key=>"value",key2=>"value2",...} 構文は、匿名ハッシュのコンストラクターです。これらについては、以下に文書化されています。 perlref マニュアル ページ, 、しかし、より親しみやすい言葉で説明されています パールレフトのチュートリアル.