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;
我正在尝试从另一个脚本(没有系统调用)调用使用 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;