perl App::Cmd 从脚本调用子命令

perl App::Cmd call subcommand from script

我正在尝试从另一个脚本(没有系统调用)调用使用 App::Cmd 实现的命令行应用程序。

我的应用程序是从 tutorial 包中获取的,有一个脚本 yourapp:

#!/usr/bin/perl
use YourApp;

一个应用程序 class YourApp.pm:

package YourApp;
use App::Cmd::Setup -app;
1;

和一个命令 class YourApp/Command/initialize.pm 有一个选项 myoption:

package YourApp::Command::initialize;
use YourApp -command;

sub opt_spec {
    return ( [ "myoption|m=s",  "my option", ],);
}

sub execute {
    my ($self, $opt, $args) = @_;        
    my $mo = $opt->myoption;
    print "Options : $mo \n";
}

1;

从脚本执行子命令工作正常,调用:

./yourapp initialize --myoption aaa 打印出想要的结果 Options : aaa.

现在我想从另一个 perl 脚本调用 execute 子例程,但是当我将选项作为散列引用传递给 execute 时,如下所示:

my $opts = {m=>"aa"}; 
use YourApp::Command::initialize;
YourApp::Command::initialize->execute($opts);

perl 抱怨 Can't call method "myoption" on unblessed reference。 通过命令调用execute时,$opts被祝福为Getopt::Long::Descriptive::Opts::__OPT__::2。但是我的脚本中加持$opts还是报错

有关于如何从脚本中调用 execute 的提示吗?

因为它是一个命令行应用程序,所以它需要与 @ARGV 交互。因此,如果您在 @ARGV 中手动设置选项并调用 YourApp->run,它将读取这些选项,并且 App::Cmd 将调用 execute()

use YourApp;
local @ARGV = qw( initialize --myoption aaa );
YourApp->run;