2011-12-05 1 views
1

私のperlモジュールの1つが別のモジュールを使用していますが、それをインポートすることはできません。 perlモジュールは、インポートされていないパッケージからメソッドを呼び出します。

しかし、私はこれが決して問題を引き起こしていないことに気付いたとき、私はショックを受けました!

コードのようなものです:

package This; 
# no import for OTHER !! 

sub new { 
    ... implementation ... 
    my $something = OTHER->new(@arguments); # no error! 
    ... more implementation ... 
} 

だから何ができますか?なしThisのインポートインポートOTHER - それは私がチェックしたものでした。

Thisをインポートするコードでも OTHER, OTHERをインポートすると、 Thisは利用できますか?


質問の明確化:

  • XY、およびZはモジュールです。 X
  • use Y;
  • X中:use Z;
  • YYZの関数やメソッドへのアクセス(およびその逆を持っていますuseZ

ありません)?

+1

どこかにインポートされています。私はあなたがこれを見つけることができる[SSCCE](http://sscce.org/)にこれを煮詰めると思う。 –

+0

@BrianRoach - 明らかにするために:XがYをインポートし、XもZをインポートする場合、YはZをインポートせずにZにアクセスできます(逆も同様です)。 –

+0

私は確信しています。一度パッケージがインポートされると、OOがperlに固執された方法のためにグローバルに利用できますが、テストする必要があります。私は実際に数年間多くのperlを書いていないし、少し錆びている。 –

答えて

4

「インポート」という用語は、少し誤解を招くことがあります。

Yは、Zにインポートすることなくアクセスできます(逆も同様です)。

はい、多かれ少なかれ。モジュールが現在のスクリプトにロードされます。すべてのuseモジュールが同じスクリプトにロードされているので、互いを見ることができます(ただし、正しい順序でuseが指定されていれば)。

しかし、真輸入 —物事をその実際のモジュール輸出、彼らはuse INGのモジュールの名前空間にコピーしているように、—ますは唯一は、モジュールの名前空間をINGのuseにコピーします。上書き、

use Time::HiRes 'time'; 

package Foo; 

sub time1() { return time(); } # calls the built-in time() function 
sub time2() { return Time::HiRes::time(); } 


package main; 

print Foo::time1(), "\n"; # prints (e.g.) 1323048440 
print Foo::time2(), "\n"; # prints (e.g.) 1323048440.80571 
print time(), "\n";  # prints (e.g.) 1323048440.8061 

それはuseTime::HiResモジュール、および現在のネームスペース(メインの名前空間)へTime::HiRes::timeをエクスポートするためにそれを伝えビルトインtime

は例えば、このPerlスクリプトを考えてみましょう。 (Time::HiRes::timetimeのようですが、それは、サブ秒の分解能を持ち、それは1323048440.80571だけではなく1323048440のようなものを与えるでしょう。)だから、Fooは、そのtimeとして、Time::HiResTime::HiRes、そして何かを見ることができるパッケージ。具体的にはTime::HiRes::timeと明記して明示的に指定する必要があります。

+0

「輸入」のヘッドアップをありがとう - 私はOPを明確にしようとしました。私はあなたの答えの最初の部分が私の特定の問題を解決すると信じています。ありがとう! –

+0

あなたは大歓迎です! – ruakh

0

はい、少なくともあなたは間接的に使用する場合:

(私は説明を簡単にするため、単一のスクリプトとして上記に書いたが、同じことがFooFoo.pmで定義され、use Foo;を使用してロードされたときに起こります。)パッケージとオブジェクト構文。

OtherPackage->method() 
$anOtherPackageObject->method() 

などの呼び出しから、Perlは、完全修飾サブルーチン名を解決することができます(上記の例の両方で&OtherPackage::method)、どこからサブルーチンを呼び出します。

関連する問題