5

requireメカニズムを使用して同じディレクトリからFoo.pmをロードするPerlスクリプト(foo.pl)があります。

require "./Foo.pm";
...
my $foo = new Foo::Bar;

Foo.pmは、標準のモジュール形式に準拠しています。

package Foo::Bar;
...
1;

アプリケーションを2つのファイル(foo.plとFoo.pm)として配布するのではなく、1つのファイルだけを配布したいと思います。具体的には、Foo.pmをfoo.plスクリプトの一部にしたいと思います。

どうすればそれを達成できますか?

2つのファイルを単純にマージするという簡単なアプローチ(cat foo.pl Foo.pm> foo2.pl)は機能しません。

4

5 に答える 5

5

Perlスクリプトを、依存するすべてのモジュールを含むバイナリにパックすることに関心がある場合は、PARPackagerを使用できます。

pp -o binary_name foo.pl
于 2009-09-12T22:06:01.973 に答える
4

ファイルには複数のパッケージを含めることができます。クラスを最初に配置し、次にメインスクリプトを配置します。

package Foo::Bar;

sub new { 
  my $class = shift;
  return bless {}, $class;
}

#...

package main;

my $foo = Foo::Bar->new();
print ref $foo;  # Foo::Bar
于 2009-09-12T19:08:52.910 に答える
3

定義される前にFoo::Barを使用しようとしたため、コードは機能しませんでした(ただし、受信したエラーメッセージを記載することは役に立ちました)。これを試して:

use strict;
use warnings;
my $foo = Foo::Bar->new();
# more code...

# end code

# begin definitions
BEGIN {
    package Foo::Bar;
    use strict;
    use warnings;
    # definitions...
    1;

    package Foo::Baz;
    # more stuff, if you need to define another class
}

追加:

于 2009-09-12T19:08:29.407 に答える
2

あなたはすでにいくつかの良い答えを持っています。さらに、スクリプトとして直接実行できるモジュールを作成することもできます。

package Foo;

__PACKAGE__->run(@ARGV) unless caller();

sub run {
    # Do stuff here if you are running the Foo.pm as
    # a script rather than using it as a module.
}

詳細については、briandfoyの「スクリプトがモジュールになる方法」を参照してください。

于 2009-09-12T21:55:13.980 に答える
2

全体的なスキームは、「require...」を必要なものの内容に置き換えることです。それだけではありません(BEGIN {}が必要になる場合があります)。何が関係しているのか正確にはわかりません。確かに、あなたはそれを自動化したいと思うでしょう。

別の方法は次のとおりです。PAR/ppを使用して、依存するモジュールがその中にパックされている単一の実行可能ファイルを生成します。

于 2009-09-12T18:56:44.407 に答える