1

如果有人能想出一种更雄辩的方式来表达我的标题,请随时提供建议……我觉得好像有一个词可以表达我正在尝试做的事情,但它正在逃避我。

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

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

标志.pm

package Flags;

sub getArguments() {
   usage();
}

1;

MyScript.pl

use Flags;

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

$args=Flags->getArguments();

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

4

3 回答 3

3

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

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
标志:使用信息
于 2013-02-21T17:04:55.307 回答
1

根据我从您的三段文本中了解到的情况,您想要的是您的 Flags.pm 子例程调用usage主脚本的子例程,无论该子例程是什么。为什么不这样做:

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

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

于 2013-02-21T16:38:55.283 回答
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();

如果你想使用子

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();
于 2013-02-21T16:59:01.007 回答