web-dev-qa-db-ja.com

呼び出された未定義のサブルーチン

私は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;
8
rightfold

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'は期待どおりに機能します。

11
amon

あなたはこのようなことをする必要があります

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

7