我编写了一个 perl 模块(比如foo
),带有一个主要子例程(比如f()
),我想以两种方式使用它:
- 导入模块,然后从脚本导入模块中
foo
调用 sub 。f(...)
foo
- 只需导入模块
foo
并获取模块foo
来调用子f(@ARGV)
或一些适当的变体。
我可以制作一个具有这两个选项的模块,
还是
我应该制作一个包装模块,比如说foo_default.pm
,它将use foo
然后调用foo::f(@ARGV)
?
我编写了一个 perl 模块(比如foo
),带有一个主要子例程(比如f()
),我想以两种方式使用它:
foo
调用 sub 。f(...)
foo
foo
并获取模块foo
来调用子f(@ARGV)
或一些适当的变体。我可以制作一个具有这两个选项的模块,
还是
我应该制作一个包装模块,比如说foo_default.pm
,它将use foo
然后调用foo::f(@ARGV)
?
如果您不想提供函数的完全限定名称,您应该export
:
package foo;
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw/func1 func2/;
sub func1 { return "hi $_[0] !\n"; }
sub func2 { return "yo breakdown mama !\n"; }
所以要使用它:
# uncomment this if you need to add a "./lib" dir in @INC
# BEGIN{ push @INC, "./lib"; }
use foo;
my $res = func1("you");
print $res;
示例 foo 模块:
package foo;
my $nodef = 0;
sub import {
my ($package, $arg) = @_;
print "import called $arg\n";
$nodef = 1 if (defined $arg && $arg eq 'nodef');
f(@ARGV) if !$nodef;
}
sub f() {
print "f() called: ", join(", ", @_), "\n";
}
1;
和用例:
sub def {
use foo;
}
sub nodef {
use foo qw(nodef);
}
def();
nodef();