いすべて/一部のサブモジュール"のPerlスクリプト?
-
23-08-2019 - |
質問
私は無料でご利用いただけるように思いった経験をPerlモジュールなんばいかかるのではないかとの見方です。
ということかを作っ数のモジュール:
foo::bar
foo::bar::a
foo::bar::b
以降どうなるかはわからないかというんの呼び出し。pmとb.pmモジュール"のサブモジュール"と言ってもいいはずだが、彼らにバーがあります。pmモジュールがまだまだ十分とはいえませんがや独立しています。
でもPerlスクリプトが使用foo::バー::a他のスクリプトが使用foo::バー:アルファベットは以下のとかいうスクリプトを利用ニーズの両方の機能を"a"または"b"のの代わりにこう言って:
use foo::bar;
use foo::bar::a qw(one two);
use foo::bar::b;
もう少し前向きなことをやりたいこのように:
use foo::bar qw(:a :b);
私の心が、これは私のスクリプトへのアクセスもバーがあります。pm。pm、およびb.時までです。
でもこのように、明らかに間違っています。
あのようなことは可能ですか?思っています。pmを使用。pmとb.午後には、"ラッパー"機能を呼び、サブモジュール"もういります。
解決
私のテストを見て::それをやって、例えば約データのモジュールを。あなたはそれを実現することができるにもかかわらず、私は結果のひどく好き行ったことがありません。代わりに、プラグインやミックスインのアプローチを検討する必要があります。これを助けることができる CPAN の上のいくつかのモジュールがあります。
ここで私はテストのために書いたカスタムimport
だ::データ:
sub import { my $self = shift; my $caller = caller; foreach my $package ( @_ ) { my $full_package = "Test::Data::$package"; eval "require $full_package; 1"; if( $@ ) { carp "Could not require Test::Data::$package: $@"; } $full_package->export($caller); } }
他のヒント
はい、あなたはそれを行うことができます。それはおそらく、着信引数にあなたが望むように解釈するカスタムFOO ::バーの[サブインポート」を書い関与します。
おそらくあなたは今、輸出を使用している、そしてそれが問題だ、あなたの構文のサポートの欠如です。あなたはモジュールの構文の輸出業者の実装について、特に特別な何もないことがわかります。それだけで一般的な慣例です。あなたはおそらく、それはあなたがが、したいと思うかについての洞察を得るためにビジネスを行う方法を見たいと思うでしょう。
、なぜあなたはそれを含めていますか?あなたはそれを含める必要はありません。のみ(呼び出し)、それを必要とするモジュール、および他のどこにモジュールが含まれます。
これは次のとおりです。あなたはそれを使用している場合は、それを「使います」。あなたがそれを使用しない場合は、それを「使用」しないでください。
はい、しかし、あなたがリグに独自のインポートサブを持っています:
use strict;
use warnings;
package ab;
use base qw<Exporter>;
our @EXPORT_OK;
our %EXPORT_TAGS;
BEGIN {
@EXPORT_OK = qw<>;
%EXPORT_TAGS = ( a => 1, b => 1, all => \@EXPORT_OK );
}
sub setup_part {
#use Smart::Comments;
my $code = shift;
my $mini_path = "foo/bar/$code.pm";
return if exists $INC{$mini_path};
require $mini_path;
my $arr_ref
= do { no strict 'refs';
\@{Symbol::qualify( 'EXPORT_OK', $code )};
};
$code->import( @$arr_ref );
push @EXPORT_OK, @$arr_ref;
$EXPORT_TAGS{$code} = [ @$arr_ref ];
return;
}
sub import {
my ( $package_name, @imports ) = @_;
my %import_hash = map { $_ => 1 } @imports;
if ( exists $import_hash{':all'} ) {
@import_hash{qw<:a :b>} = ( 1, 1 );
}
foreach my $import ( grep { exists $import_hash{$_} } qw<:a :b> ) {
setup_part( substr( $import, 1 ));
}
goto &{Exporter->can( 'import' )};
}
1;
していたが、その解決に似ている。知ってい--も古いスレッドのがんのコメントの答え(月12'09:17:55) brian d foy でも悲しい評判ります。そんな理由で追加コメントとして新します。
えっ問題を解決すると同様のいる。ができるように改場合には使用 use lib
.
私を信じてチームのモジュールのように見える A::B::*
.きを読み込みスクリプトのモジュール A::B
.すべてのモジュール内のファイルと同じディレクトリに搭載す。この機構を用いたことを示唆する brian d foy まで多くの 互誤差の再定義.回避すべての思ったより no warnings 'redefine'
.今まで無料利用 use lib
, no warnings 'redefine'
または shift @INC, ...
メインスクリプト
sub import { @TAGS = ( @_ ); my $me = shift @TAGS; ( my $pm = $me ) =~ s|::|/|g; $pm .= ".pm"; ( $dir = $INC{$pm} ) =~ s/\.pm$//; foreach ( glob "$dir/*.pm" ) { /(\w+)\.pm$/; my $module = "${me}::$1"; eval "use $module qw(:all)"; # You are free to use any items in the exporting list die "$me: Error while loading $module from $_: $@\n" if $@; } # Fill in @EXPORT_OK and %EXPORT_TAGS manually from each A::B::*::EXPORT_OK # ... goto &{ Exporter->can( "import" ) }; }