我正在使用 Perl CLI 框架编写一些脚本。现在我想将变量从控制模块传递到子命令模块。我尝试将变量设置为控制模块中的全局变量,但子命令模块仍然无法获取变量。它甚至无法在同一个模块中共享全局变量。执行脚本时有一些错误消息:
[root@old]# perl pc --ip=dsfa --device dsfasdf on 在连接 (.) 或 Power/Control.pm 第 63 行的字符串中使用未初始化的值 $Power::Control::data。
全局数据是使用未初始化的值 $Power::Control::data in concatenation (.) 或 Power/Control.pm 第 75 行的字符串。
来自父母的数据是
设备名称为 dsfasdf
ip地址是dsfa
这是上的命令
这是脚本电脑:
#! /usr/bin/perl
use strict;
use warnings;
use Power::Control;
use lib 'lib';
# ---- EXECUTION ----
Power::Control->run(); # Launch command
这是电源/Control.pm:
package Power::Control;
use base qw( CLI::Framework );
use strict;
use warnings;
sub usage_text {
qq{
$0 [--verbose|v]:
OPTIONS:
--verbose -v: be vebose
ARGUMENTS (subcommands):
on: power on the device
off: power off the device
reboot: reboot the device
version: show PDU version
status: show PDU status
sysstat: show PDU sysstatus
}
}
sub option_spec {
[ 'device|d=s' => 'device name' ],
[ 'ip=s' => 'ip address' ],
[ 'user|u=s' => 'user name' ],
[ 'password|p=s' => 'password' ],
[ 'interval|i=s' => 'interval' ],
[ 'brand|b=s' => 'brand' ],
[ 'community|c=s' => 'community' ],
[ 'version|v=s' => 'version' ],
}
sub command_map {
on => 'Power::Control::Command::On',
off => 'Power::Control::Command::Off',
reboot => 'Power::Control::Command::Reboot',
version => 'Power::Control::Command::Version',
status => 'Power::Control::Command::Status',
sysstat => 'Power::Control::Command::Sysstat',
}
sub command_alias {
r => 'reboot',
v => 'version',
st => 'status',
sys => 'sysstat',
}
our $opts;
our $self;
our $data;
sub init {
($self, $opts) = @_;
$data = $opts->{'ip'};
print "\n The device name is $opts->{'device'}\n";
print "\n The ip address is $data\n";
}
print "\n The globla data is $data\n";
1;
# ---- COMMAND: On ----
package Power::Control::Command::On;
use base qw( CLI::Framework::Command );
use strict;
use warnings;
use Power::Control;
use Data::Dumper;
print "\n The data from parent is $data \n";
sub usage_text {
q{
on [--d=<device name>: Power on the device
}
}
#sub option_spec {
# [ 'device|d=s@' => 'device name' ],
#}
sub run {
print "\n This is the command on\n";
}
1;