ここで何が起こるかわかりません:
use PAR { file => 'foo.par', fallback => 1 };
それは匿名ハッシュだと思います。モジュールはラインからどのように使用していuse
ますか? 光を当てることができますか?
編集: PAR モジュールには興味がありません。私はそれがカーテンの後ろでどのように機能するかに興味があります. モジュールをそのように構成するにはどうすればよいですか?
ここで何が起こるかわかりません:
use PAR { file => 'foo.par', fallback => 1 };
それは匿名ハッシュだと思います。モジュールはラインからどのように使用していuse
ますか? 光を当てることができますか?
編集: PAR モジュールには興味がありません。私はそれがカーテンの後ろでどのように機能するかに興味があります. モジュールをそのように構成するにはどうすればよいですか?
use
モジュールの場合、引数のリストを渡すことができます。あなたの例(タイプミスがあり、閉じ引用符が欠落しているようです)では、1つの要素(ハッシュ参照)を持つリストが渡されます。
より一般的に:
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, @_);
}
より基本的には、これはおかしな 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()
何でも行うことができます (混乱を招かないように、しっかりと文書化してください!)
はい、それは匿名ハッシュです。modules メソッドに引数として渡されますimport
。
あなたの質問への直接の答え: 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 チュートリアルでより分かりやすい用語で説明されています。
PAR は CPAN モジュールのPerl Archive Toolkitです。hashref は、PAR に渡される構成パラメーターです。
コード:
use PAR { file => 'foo.par, fallback => 1 };
use Foo::Bar;
利用可能な場合は使用することを意味しますが、それ以外の場合は、アーカイブ " " (おそらく のアーカイブ バージョンを保持している) を使用Foo::Bar
するようにフォールバックします。foo.par
Foo::Bar