【问题标题】:How to call same subroutine from Perl module in different ways? What is Perl Module "Default mode"?如何以不同的方式从 Perl 模块调用相同的子程序?什么是 Perl 模块“默认模式”?
【发布时间】:2012-12-22 23:45:30
【问题描述】:

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

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

我可以制作一个具有这两个选项的模块吗,

我是否应该制作一个包装器模块,比如foo_default.pm,它将use foo 然后调用foo::f(@ARGV)

【问题讨论】:

  • 您能否发布一些您尝试过一些适当的变体的代码?因为您可以像 sputnick 向您展示的那样导出函数。这将适用于带参数的函数调用,只需使用 my $args = @_; 作为函数 f() 的第一行。

标签: perl wrapper perl-module overloading


【解决方案1】:

经典之道

如果你不想提供函数的完全限定名,你应该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;

【讨论】:

    【解决方案2】:

    示例 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      • 1970-01-01
      • 2016-06-05
      相关资源
      最近更新 更多