0

我编写了一个 perl 模块(比如foo),带有一个主要子例程(比如f()),我想以两种方式使用它:

  1. 导入模块,然后从脚本导入模块中foo调用 sub 。f(...)foo
  2. 只需导入模块foo并获取模块foo来调用子f(@ARGV)或一些适当的变体。

我可以制作一个具有这两个选项的模块,
还是
我应该制作一个包装模块,比如说foo_default.pm,它将use foo然后调用foo::f(@ARGV)

4

2 回答 2

2

经典之道

如果您不想提供函数的完全限定名称,您应该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;
于 2013-01-09T00:46:46.657 回答
1

示例 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();
于 2013-01-09T01:04:14.457 回答