web-dev-qa-db-ja.com

Perlスクリプトに別のファイルの関数を含めるにはどうすればよいですか?

これは本当に簡単な質問のように思えますが、どういうわけか私のGoogle-Fuは失敗しました。

Perlの他のファイルの関数を含めるための構文は何ですか?私はCのようなものを探しています#include "blah.h"

Perlモジュールを使用するためのオプションを見ましたが、それは私の現在のコードの重要でない書き換えを必要とするようです。

65
Zain Rizvi

モジュールを使用します。 perldoc perlmod および Exporter を確認してください。

ファイルFoo.pmに

package Foo;
use strict;
use warnings;
use Exporter;

our @ISA= qw( Exporter );

# these CAN be exported.
our @EXPORT_OK = qw( export_me export_me_too );

# these are exported by default.
our @EXPORT = qw( export_me );

sub export_me {
    # stuff
}

sub export_me_too {
    # stuff
}

1;

メインプログラムで:

use strict;
use warnings;

use Foo;  # import default list of items.

export_me( 1 );

または、両方の機能を取得するには:

use strict;
use warnings;

use Foo qw( export_me export_me_too );  # import listed items

export_me( 1 );
export_me_too( 1 );

パッケージ変数をインポートすることもできますが、この方法はお勧めしません。

66
daotoad

Perl 必須 が仕事をします。追加することにより、「必要な」ファイルが真実を返すようにする必要があります。

1;

ファイルの最後。

これは小さなサンプルです:

$ cat m1.pl 
use strict;
sub x { warn "aard"; }
1;

$ cat m2.pl 
use strict;
require "m1.pl";
x();

$ Perl m2.pl 
aard at m1.pl line 2.

ただし、できる限り早くモジュールに移行してください

[〜#〜] edit [〜#〜]

スクリプトからモジュールにコードを移行することのいくつかの利点:

  • パッケージがないと、すべてが単一の名前空間を占有するため、別々のファイルの2つの関数が同じ名前を必要とする場合があります。
  • パッケージを使用すると、一部の機能を公開できますが、他の機能は非表示にできます。パッケージがない場合、すべての機能が表示されます。
  • requireでインクルードされたファイルは実行時にのみロードされますが、useでロードされたパッケージは以前のコンパイル時チェックの対象となります。
46
martin clayton

require または se キーワードを探していると思います。

8
Daniel Plaisted

また、do 'file.pl';は機能しますが、モジュールの方が優れたソリューションです。

7
glenn jackman

私は質問が具体的には「関数」と言っていることを知っていますが、「Perl include」を探すと、この記事を検索し、しばしば(今のように)変数を(簡単な方法で、考えずにモジュールについて)。そして、ここに私の例を投稿してもいいことを願っています(参照: Perl require and variables ;簡単に:requireを使用し、 "includer"と "includee"ファイルの両方を確認してください変数をourとして宣言します):

$ Perl --version

This is Perl, v5.10.1 (*) built for i686-linux-gnu-thread-multi ...

$ cat inc.pl
use warnings;
use strict;

our $xxx = "Testing";

1;

$ cat testA.pl 
use warnings;
use strict;

require "inc.pl";
our $xxx;

print "1-$xxx-\n";
print "Done\n";

$ Perl testA.pl 
1-Testing-
Done


$ cat testB.pl 
use warnings;
use strict;

our $xxx;
print "1-$xxx-\n";

$xxx="Z";
print "2-$xxx-\n";

require "inc.pl";

print "3-$xxx-\n";
print "Done\n";

$ Perl testB.pl 
Use of uninitialized value $xxx in concatenation (.) or string at testB.pl line 5.
1--
2-Z-
3-Testing-
Done
5
sdaau

あなたが探しているのは「require file.pl」ですが、あなたが見ているべきは「use module」です。

4
aartist

ただし、Perlモジュールを実際に調べる必要があります。簡単にハックするには、PerlスクリプトをCプリプロセッサーで実行する「Perl -P」を常に実行できます。つまり、#includeやフレンドを作成できます。

ただし、簡単にハックするだけです;-)

4
Benj

上記の答えはすべてクライアント部分を無視しました:モジュールのインポート方法。

ここで受け入れられた答えを参照してください: 相対ロケーションからPerlモジュールを使用するにはどうすればよいですか?

この答えにトリックがないと、use $mymodule;

3
kakyo