0

次のようなディレクトリ構造があります。

Foo :: Bar :: Baz :: 1 Foo :: Bar :: Baz::2など

次のようなパッケージを一覧表示できますか?

use Foo::Bar::Baz;

ありがとう!

編集:モジュールが何であるかをより明確にしました。

4

4 に答える 4

7

インクルード パス内のすべてのモジュールを特定のプレフィックス (たとえば、 の下のすべて) と共にロードする場合は、Module::Find をa::b::c使用できます。

例えば:

use Module::Find 'useall';

my @loaded = useall 'Foo::Bar::Baz';  # loads everything under Foo::Bar::Baz

これは、@INCパスが必要なディレクトリで設定されているかどうかに依存するため、use lib最初に必要な操作 (たとえば を使用) を実行します。

于 2010-06-04T17:01:44.580 に答える
1

これはやり過ぎかもしれませんが、モジュールをロードする前後にシンボル テーブルを調べて、何が変更されたかを確認できます。

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::
        ::変数::
        ::警告::登録::
于 2010-06-04T17:36:12.163 に答える
1

通常、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)'
于 2010-06-04T17:00:38.877 に答える
0

明確にするために、ランダムな Perl コードでランダムなパッケージを見ていますか?

またはPerlモジュールの場合、たとえば「a/b/c/d1.pm」とモジュール「a::b::c::d1」?

いずれの場合も、単一の「use」ステートメントを使用してすべてをロードすることはできません。

あなたがする必要があるのは、またはのいずれglobかを使用して、適切なファイルをすべて見つけることですFile::Find

最初のケース (モジュール) では、require各ファイルを -ing するか、ファイル名をモジュール名 ( ) に変換して各モジュールを個別にs#/#::#g; s#\.pm$##;呼び出すことで、それらをロードできます。use

ランダムな Perl ファイルにネストされた実際のパッケージに関する限り、それらのパッケージは次のようになります。

  • 各ファイルを grep することによってリストされます (ここでもgloborで見つかりますFile::Find)。/^package (.*);/

  • require $fileファイルごとに実行することで実際に読み込まれます。

    この場合、これらの各パッケージのパッケージ名は「a::b::c」に関連付ける必要a/b/c/1.plないことに注意してください。たとえば、ファイルの作成者によって「p1」、「a::」という名前を付けることができます。 p1」または「a::b::c::p1_something」。

于 2010-06-04T17:00:42.027 に答える