次のようなディレクトリ構造があります。
Foo :: Bar :: Baz :: 1 Foo :: Bar :: Baz::2など
次のようなパッケージを一覧表示できますか?
use Foo::Bar::Baz;
ありがとう!
編集:モジュールが何であるかをより明確にしました。
次のようなディレクトリ構造があります。
Foo :: Bar :: Baz :: 1 Foo :: Bar :: Baz::2など
次のようなパッケージを一覧表示できますか?
use Foo::Bar::Baz;
ありがとう!
編集:モジュールが何であるかをより明確にしました。
インクルード パス内のすべてのモジュールを特定のプレフィックス (たとえば、 の下のすべて) と共にロードする場合は、Module::Find をa::b::c
使用できます。
例えば:
use Module::Find 'useall';
my @loaded = useall 'Foo::Bar::Baz'; # loads everything under Foo::Bar::Baz
これは、@INC
パスが必要なディレクトリで設定されているかどうかに依存するため、use lib
最初に必要な操作 (たとえば を使用) を実行します。
これはやり過ぎかもしれませんが、モジュールをロードする前後にシンボル テーブルを調べて、何が変更されたかを確認できます。
use strict; use warnings;
my %original = map { $_ => 1 } get_namespaces("::");
require Inline;
print "New namespaces since 'require Inline' call are:\n";
my @new_namespaces = sort grep !defined $original{$_}, get_namespaces("::");
foreach my $new_namespace (@new_namespaces) {
print "\t$new_namespace\n";
}
sub get_namespaces {
# recursively inspect symbol table for known namespaces
my $pkg = shift;
my @namespace = ();
my %s = eval "%" . $pkg;
foreach my $key (grep /::$/, keys %s) {
next if $key eq "main::";
push @namespace, "$pkg$key", get_namespaces("$pkg$key");
}
return @namespace;
}
「require Inline」呼び出し以降の新しい名前空間は次のとおりです。 ::オートローダー:: ::設定:: ::ダイジェスト:: ::ダイジェスト::MD5:: ::ドス:: ::EPOC:: ::エクスポーター:: ::エクスポーター::重い:: ::ファイル:: ::ファイル::スペック:: ::ファイル::仕様::Cygwin:: ::ファイル::仕様::Unix:: ::ファイル::仕様::Win32:: ::インライン::ファイル:: ::インライン::デンター:: ::スカラー:: ::スカラー::ユーティリティ:: ::ソケット:: ::VMS:: ::VMS::ファイルスペック:: ::XSLoader:: ::変数:: ::警告::登録::
通常、a/b/c.pl などのスクリプトには .pl 以外の名前空間はありませんmain
。おそらく、a/b/c.pm のような名前のモジュールを発見することを考えているでしょう(小文字のパッケージ名は一般に Perl 内部用に予約されているため、これは悪い名前です)。
ただし、ディレクトリ パスが指定されている場合は、File::Findを使用して潜在的なPerl モジュールを探すことができます。
use strict;
use warnings;
use File::Find;
use Data::Dumper;
my @modules;
sub wanted
{
push @modules, $_ if m/\.pm$/
}
find(\&wanted, 'A/B');
print "possible modules found:\n";
print Dumper(\@modules)'
明確にするために、ランダムな Perl コードでランダムなパッケージを見ていますか?
またはPerlモジュールの場合、たとえば「a/b/c/d1.pm」とモジュール「a::b::c::d1」?
いずれの場合も、単一の「use」ステートメントを使用してすべてをロードすることはできません。
あなたがする必要があるのは、またはのいずれglob
かを使用して、適切なファイルをすべて見つけることですFile::Find
。
最初のケース (モジュール) では、require
各ファイルを -ing するか、ファイル名をモジュール名 ( ) に変換して各モジュールを個別にs#/#::#g; s#\.pm$##;
呼び出すことで、それらをロードできます。use
ランダムな Perl ファイルにネストされた実際のパッケージに関する限り、それらのパッケージは次のようになります。
各ファイルを grep することによってリストされます (ここでもglob
orで見つかりますFile::Find
)。/^package (.*);/
require $file
ファイルごとに実行することで実際に読み込まれます。
この場合、これらの各パッケージのパッケージ名は「a::b::c」に関連付ける必要a/b/c/1.pl
がないことに注意してください。たとえば、ファイルの作成者によって「p1」、「a::」という名前を付けることができます。 p1」または「a::b::c::p1_something」。