私はPerlで簡単なモジュールの使用をしようとしています:
Flame/Text.pm:
package Flame::Text;
sub words { … }
1;
Flame/Query.pm:
package Flame::Query;
use Flame::Text qw(words);
sub parse_query { words(shift); }
parse_query 'hi';
1;
次のエラーメッセージが表示されるのはなぜですか?
未定義のサブルーチン
&Flame::Query::words
Flame /Query.pmの3行目で呼び出されます。
以下は問題なく動作します。
package Flame::Query;
use Flame::Text;
sub parse_query { Flame::Text::words(shift); }
parse_query 'hi';
1;
Flame::Text
パッケージからwords
サブルーチンをインポートまたはエクスポートしたことはありません。ステートメントuse Some::Module @args
は次と同等です。
BEGIN {
require Some::Module;
Some::Module->import(@args);
}
つまり、import
メソッドは指定された引数で呼び出されます。このメソッドは通常、さまざまなシンボルを1つのパッケージから呼び出し元のパッケージにエクスポートします。
独自のimport
を作成しないでください。代わりに、Exporter
モジュールから継承できます。このモジュールは、エクスポート可能なシンボルを@EXPORT_OK
グローバル変数に格納することによって構成されます。したがって、コードは次のようになります。
package Flame::Text;
use parent 'Exporter'; # inherit from Exporter
our @EXPORT_OK = qw/words/; # list all subs which you want to export upon request
sub words { ... }
これで、use Flame::Text 'words'
は期待どおりに機能します。
あなたはこのようなことをする必要があります
package Flame::Text;
use Exporter 'import'; # gives you Exporter's import() method directly
@EXPORT_OK = qw(words); # symbols to export on request
perlはデフォルトで名前空間をエクスポート(または汚染)しないため
http://perldoc.Perl.org/Exporter.html
することを忘れないでください
use strict; use warnings;
すべてのことでPerl