I am using Perl CLI Framework to write some script. Now I want to pass the variable from the control module to the sub-command module. I have tried to set the variable as the global variable in the control module but the sub-command module still cannot get the variable. It is even not able to share the global variable in the same module. There are some error messages when executing the script:
[root@old]# perl pc --ip=dsfa --device dsfasdf on Use of uninitialized value $Power::Control::data in concatenation (.) +or string at Power/Control.pm line 63. The globla data is Use of uninitialized value $Power::Control::data in concatenation (.) +or string at Power/Control.pm line 75. The data from parent is The device name is dsfasdf The ip address is dsfa This is the command on
Here is the script pc:
#! /usr/bin/perl use strict; use warnings; use Power::Control; use lib 'lib'; # ---- EXECUTION ---- Power::Control->run(); # Launch command
Here is the Power/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;

In reply to How to share the global variables between two modules by using Perl CLI Framework? by ballstar

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.