我有一个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)的简单方法不起作用。
答案 0 :(得分:5)
如果您有兴趣将Perl脚本打包成包含所依赖的所有模块的二进制文件,可以使用PAR Packager:
pp -o binary_name foo.pl
答案 1 :(得分:4)
文件可以包含多个包。先把你的班级,然后是主要的脚本:
package Foo::Bar;
sub new {
my $class = shift;
return bless {}, $class;
}
#...
package main;
my $foo = Foo::Bar->new();
print ref $foo; # Foo::Bar
答案 2 :(得分: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
}
加法:
答案 3 :(得分:2)
总体方案是用您要求的内容替换您的“要求......”。除此之外还有更多(可能需要BEGIN {}),而且我不确定所涉及的内容。当然,你想要自动化它。
这是另一种选择:生成一个可执行文件,其中依赖的模块使用PAR/pp
打包在其中答案 4 :(得分: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的How a Script Becomes a Module。