7

Perlモジュールの使用について読んだすべてのことから、基本的な使用法は次のとおりです。

  • .pmステートメントを含む拡張子付きのモジュールファイルpackage <name>。ここ<name>で、は拡張子なしのモジュールのファイル名です。
  • モジュールを使用するコードファイルには、ステートメントが含まれていますuse <name>;

私がコーディングしているアプリケーションには、約5つのモジュールを使用する1つのメインコードスクリプトがあります。モジュールにステートメントを含めるのを忘れていましたpackage <name>が、コードはuse <name>ステートメントで問題なく実行されました。モジュールの1つでエラーが発生し始めUndefined subroutineたので、各モジュールにpackageステートメントを追加しました。これで、これらのモジュールの残りは動作を停止しました。何が得られますか?

例:

mainapp.pl

#!/usr/bin/perl
use UtyDate;
my $rowDate = CurrentDate("YYYYMMDD");

UtyDate.pm

#!/usr/bin/perl
package UtyDate;
sub CurrentDate
{
    #logic
}
return 1;

上記のコードを実行すると、エラーが発生しますUndefined subroutine &main::CurrentDate called at...。ただし、package UtyDate;UtyDate.pmから行を削除しても、エラーは発生しません。この状況は、すべてではありませんが、いくつかのモジュールに存在します。

明らかに私が示していないコードはもっとたくさんありますが、私が示していないコードのいずれかが、ここに示したパッケージ/使用構造にどのように影響するか混乱しています。

4

4 に答える 4

10

モジュールを使用すると、モジュール内のコードがコンパイル時に実行されます。次に、モジュールのパッケージ名に対して import が呼び出されます。だから、use Foo;と同じですBEGIN { require Foo; Foo->import; }

packageすべてのコードがパッケージの下で実行されたため、コードは宣言なしで機能しましmainた。これは、メイン アプリケーション コードによって使用されます。

宣言を追加するpackageと、定義したサブルーチンが ではなく で定義されているため、機能しなくなりmainましたUtyDate

サブルーチンにアクセスするには、完全修飾名を使用するか、モジュールを実行するUtyDate::CurrentDate();ときにサブルーチンを現在の名前空間にインポートしuseます。

UtyDate.pm

package UtyDate;
use strict;
use warnings; 

use Exporter 'import';

# Export these symbols by default.  Should be empty!    
our @EXPORT = ();

# List of symbols to export.  Put whatever you want available here.
our @EXPORT_OK = qw( CurrentDate  AnotherSub ThisOneToo );

sub CurrentDate {
    return 'blah';
}

sub AnotherSub { return 'foo'; }

メインプログラム:

#!/usr/bin/perl
use strict;
use warnings; 

use UtyDate 'CurrentDate';

# CurrentDate is imported and usable.    
print CurrentDate(), " CurrentDate worked\n";

# AnotherSub is not
eval {  AnotherSub() } or print "AnotherSub didn't work: $@\n";

# But you can still access it by its fully qualified name
print UtyDate::AnotherSub(), " UtyDate::AnotherSub works though\n";

詳細については、エクスポーターのドキュメントを参照してください。

于 2010-06-04T22:04:14.793 に答える
3

エクスポータのperlヘッダーコードがありません。パッケージステートメントの下のpmファイルの先頭に次のようなものを追加する必要があります。

package UtyDate;
BEGIN {
  use Exporter ();
  use vars qw($VERSION @ISA @EXPORT);
  $VERSION = "1.0.0";
  @ISA = qw(Exporter);
  @EXPORT = qw( &CurrentDate );
}

このリンクを参照してください:http://perldoc.perl.org/Exporter.html#DESCRIPTION

于 2010-06-04T21:05:31.260 に答える
1

グレイの提案の代わりに、これを行うことができます:

use UtyDate;
UtyDate::CurrentDate(...);
于 2010-06-04T21:09:09.133 に答える
0

エクスポータを使用する以外に、Grayが指摘しているように、モジュール名を使用して関数を呼び出すこともできます(醜いですが、機能します)。

関数/プロシージャは、異なる名前空間(モジュール名で定義)にあるため、機能しません

use UtyDate;

UtyDate::CurrentDate(  )
于 2010-06-04T21:09:46.650 に答える