【问题标题】:perl App::Cmd call subcommand from scriptperl App::Cmd 从脚本调用子命令
【发布时间】:2015-05-02 21:01:48
【问题描述】:

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

我的应用取自包的tutorial,有一个脚本yourapp

#!/usr/bin/perl
use YourApp;

一个应用类YourApp.pm:

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

还有一个命令类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

【问题讨论】:

    标签: perl command-line-arguments


    【解决方案1】:

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

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

    【讨论】:

    • 是的,这对我有用!我已经看到App::Cmd::Tester 以类似的方式进行操作。为什么要声明 ARGV local
    • 哦,local 不是强制性的。我在我的 t 脚本中进行了一系列测试。
    猜你喜欢
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多