9

@INC私はPerlの問題を抱えています:パス要素とuseステートメントに応じて、シンボルをインポートします。

フルパスを に入れる@INCと、インポートが機能します。パスの一部がuseステートメント内にある場合、インポートするモジュールが実行されますが、インポートは明示的に行う必要があります。

########################################
# @INC has: "D:/plu/lib/"

#------------------------------------------------
# Exporting file is here: "D:/plu/lib/impex/ex.pm"
#
use strict;
use warnings;
package ex;

use Exporter;
our @ISA = 'Exporter';
our @EXPORT = qw( fnQuark );

sub fnQuark { print "functional quark\n"; }

print "Executing module 'ex'\n";
1;

#------------------------------------------------
# Importing file, example 1, is here: "D:/plu/lib/impex/imp.pl"
#
use strict;
use warnings;
package imp;

use impex::ex;

ex->import( @ex::EXPORT );    # removing this line makes fnQuark unavailable!
                              # Why is this necessary, 'ex.pm' being an Exporter?
fnQuark();

#------------------------------------------------
#  Importing file, example 2, is here: "D:/plu/lib/impex/imp2.pl"
#
use strict;
use warnings;
package imp2;

use lib 'D:/plu/lib/impex';
use ex;

fnQuark();                    # works without explicit import
#-------------------------------------------------

私の間違いは何ですか?

4

1 に答える 1

10

あなたが言う時

use Foo;

これは次と同等です。

BEGIN { 
    require 'Foo.pm';
    Foo->import;
};

でパッケージをex.pm名前付きで定義したexのでuse impex::ex、Perl は暗黙的に を実行しますimpex::ex->import。ただし、 という名前のパッケージはないため、シンボルを取得するにimpex::exは手動でインポートする必要があります。ex

これを行う正しい方法は、モジュールを既存のディレクトリの下に置き、そのディレクトリ@INCからの絶対パス名に基づいてパッケージに名前を付けること@INCです。だからあなたimpex/ex.pmは始めるべきでpackage impex::ex;あり、それがあなたがすべき方法ですuse

パッケージ名が長くて扱いにくいことが心配な場合は、 aliased をご覧ください。

于 2012-06-22T09:16:20.387 に答える