从所述脚本使用的包中访问属于脚本的方法

时间:2013-02-21 16:31:54

标签: perl packages

如果有人能想出一种更有说服力的方式来标题我的标题,请随时提出建议......我觉得好像我正在尝试做什么,但它正在逃避我。

无论如何,我已经制作了一堆Perl脚本,每个脚本都有一个“usage()”方法,主要描述了如何使用相应的脚本。现在,我还得到了一个包,每个脚本(Flags.pm)使用它来解析脚本使用的命令行参数。我想要做的就是让它在Flags.pm(getArguments())中调用的方法将尝试确定是否设置了特定的标志(例如-help),然后从该方法内调用父脚本“用法()“ 方法。

这个想法是避免在每个脚本中放置代码调用“usage()”,因为每个脚本都会在相同的条件下调用它。我想在Flags.pm中使用我的getArguments()来处理它。基本上,我只是想实现这个......

Flags.pm

package Flags;

sub getArguments() {
   usage();
}

1;

MyScript.pl

use Flags;

sub usage() {
   print "Hello World";
}

$args=Flags->getArguments();

TL; DR:为脚本导入Perl包。想要从导入包中的方法中调用脚本中找到的方法。

3 个答案:

答案 0 :(得分:3)

我可能会选择传递给getArguments对打印使用信息的子的引用:

package Flags;

use strict; use warnings;

sub getArguments {
    my $usage = shift;
    return $usage->(__PACKAGE__);
}

package main;

use strict; use warnings;

sub usage {
    my $pkg = shift;
    return sprintf "%s: Usage information", $pkg;
}

print Flags::getArguments(\&usage), "\n";

输出:

C:\temp> uu
Flags: Usage information

答案 1 :(得分:1)

根据我对你的三段文字的理解,你想要的是你的Flags.pm子程序调用主脚本的usage子程序,无论该子程序是什么。为什么不这样做:

sub getArguments() {
   main::usage();
}

main是顶级软件包,即您的主要脚本。

答案 2 :(得分:0)

不是正确的方法。

package Flags;

our $USAGE;

sub set_usage {
   $USAGE = $_[0];
}

sub usage {
   print 'No usage'
      unless defined $USAGE;
   print $USAGE;
}

sub getArguments() {
   usage();
}

1;

和.pl

use Flags;

Flags->set_usage('Usage here');

$args=Flags->getArguments();

如果你想使用sub

package Flags;

our $USAGE;

sub set_usage {
   $USAGE = $_[0];
}

sub usage {
   print 'No usage'
      unless defined $USAGE;
   &$USAGE;
}

sub getArguments() {
   usage();
}

1;

和.pl

use Flags;

my $usage_sub = sub {
    print 'Hello World!!!';
}

Flags->set_usage($usage_sub);

$args=Flags->getArguments();