2009-11-09 10 views
7

モジュールFOO/bar.pmを持つモジュールからの輸出シンボルのperl:> 1パッケージ

package foo::bar; 
stuff 
stuff 
package foo::wizzy; 
require Exporter; 
our @ISA=qw(Exporter); 
our @EXPORT=qw(x); 
use constant 
{ 
    x=>1 
}; 

use Foo::bar; 

は、私が知っているfoo::wizzy::x輸出に

を得ないん消費者私はそれを2つの別々のモジュールにすることができますが、私はまだこの作業をすることができます。実際には、本質的にされて、何が起こるか

+1

すべてのTHX - コンセンサスはそう - 私は怠け者 されていたと私はfooがその場合 – pm100

+2

をfooではなく、私はあなたをupvoteだろうと言うことを約束する2つのファイル を使用! :) – Ether

答えて

3

モジュールの終わりに、PUT:

BEGIN { $INC{'foo/wizzy.pm'} = 1 } 

その後コードはちょうど言うことができます:

use foo::bar; 
use foo::wizzy; 

foo :: wizzyの輸出を得る。

+0

ooo - thats a good one - thx – pm100

7

あなたがuse foo::barを呼び出し、:

BEGIN { 
    require foo::bar; 
    foo::bar->import; 
} 

perldoc -f useを参照)

のでimportfoo::wizzyに呼び出されていないばかりありません。これらのシンボルもインポートしたい場合はBEGIN { foo::wizzy->import }use foo::bar以降)にご連絡ください。または、あなたが言ったように、これらの2つのパッケージを別々のファイルに分割するだけで、はるかに人間が読めるようになります。

(これらは一般のperlプラグマのために予約されているような方法によって、それは、小文字に変換パッケージ名を使用することをお勧めしません。)

+1

OPはfoo :: barのカスタムの 'import'メソッドを書いてFoo :: wizzyのものをエクスポートすることもできます。 (そういうわけではありません) –

+4

@Michael:ええ、私はバックナンバーのコードのためにパッケージをまとめているだけなので、この時点で私は "f--これら2つのパッケージを1つのファイルに保存することから時間を節約することはできません。 – Ether

+0

+1特に上記のコメント。 –

7

あなたは「メインパッケージ」再を持っている輸出業者のexport_to_levelメソッドを使用してそれを行うことができますそのような「その他」のパッケージのシンボル-export:

sub import { 
    my $self = shift; 
    $self->export_to_level(1, @_); 
    Some::Other::Module->export_to_level(1); 
} 

Some::Other::Moduleは、「すべてをエクスポート」よりも複雑な何かをした場合、あなたはおそらく@_ための手の込んだ処理が必要になりますけれども。

私は言葉「良いコード」:)

+0

+1 'export_to_level'を忘れて機能性を再現しました;-) –

+1

ええ、私のシンボルテーブルで誰かがぶち壊っているのを見ると、少し守り始めます。それは個人的な空間の侵略のようなものです。緊急時には良い、または私に結婚してください:) – Ether

2

まずオフと互換性があります。このため、使用を想像することはできません—、私はそれが参考に括弧を囲む使用することを見つけるのに、私は本当に、なぜを聞いています複数のパッケージを1つのファイルにまとめるときにスコープを制御します。また、パッケージをBEGINブロックで囲むことで、適切に動作するようになります。useがロードされていましたが、主にこのスクリプトをメインスクリプトに詰め込んでいる場合がほとんどです。

use Fooは、BEGIN { require Foo; Foo->import }と同じです。あなたのメインスクリプトで

  • コールBEGIN{ Foo::Whizzy->import; }

    だから、あなたは、2つの選択肢があります。

  • make Foo::Bar::import呼び出し元モジュールのFoo::Whizzy::importトリガー。

In Foo/Bar。午後:あなたのメインコードで

{ package Foo::Bar; 
    use Exporter qw(export_to_level); 

    # Special custom import. Not needed if you call Foo::Whizzy->import 
    sub import { 
    shift; 
    export_to_level('Foo::Whizzy', 1, @_); 
    } 

    # stuff 
    # stuff 
} 

{ package Foo::Whizzy; 
    require Exporter; 

    our @ISA=qw(Exporter); 
    our @EXPORT=qw(x); 
    use constant { x=>1 }; 

} 

1; # return true 

use Foo::Bar; 

# If you don't do a custom import for Foo::Bar, add this line: 
BEGIN { Foo::Whizzy->import }; 
関連する問題