5

我有一个 Perl 脚本 (foo.pl),它使用 require 机制从同一目录加载 Foo.pm:

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

Foo.pm 遵循标准模块格式:

package Foo::Bar;
...
1;

我不想将我的应用程序分发为两个文件(foo.pl 和 Foo.pm),我只想分发一个文件。更具体地说,我想让 Foo.pm 成为 foo.pl 脚本的一部分。

我该如何做到这一点?

简单地合并两个文件 (cat foo.pl Foo.pm > foo2.pl) 的简单方法不起作用。

4

5 回答 5

5

如果您有兴趣将您的 Perl 脚本打包成包含它所依赖的所有模块的二进制文件,您可以使用PAR Packager

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.
}

有关其他详细信息,请参阅 brian d foy 的脚本如何成为模块

于 2009-09-12T21:55:13.980 回答
2

总体方案是用您需要的内容替换您的“要求......”。不仅如此(可能需要 BEGIN { }),而且我不完全确定所涉及的内容。当然,您希望将其自动化。

这是另一种选择:生成单个可执行文件,您所依赖的模块使用PAR/pp打包在其中

于 2009-09-12T18:56:44.407 回答