The source code of the three scripts is as follows.
tryStuffAlpha
### begin_: tryStuffAlpha.pm package tryStuffAlpha; use strict; use warnings; use Exporter; use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $VERSION); use vars qw( $PermaLink $OppositePermaLink ); $VERSION = 1.00; # Or higher @ISA = qw(Exporter); use tryStuffBeta; ### begin_: init vars $PermaLink = "PERMALINK-ALPHA\n"; $OppositePermaLink = "AOppositeLink=" .$tryStuffBeta::Permalink." +\n"; ### begin_: subroutines push @EXPORT_OK, qw( SayHello ); sub SayHello { my $strOut; $strOut = "Alpha Says Hello World! \n"; return $strOut; }###end_sub push @EXPORT_OK, qw( SayOpposite ); sub SayOpposite { my $strOut; $strOut = "Say Opposite Alpha =".tryStuffBeta::SayHello(); return $strOut; }###end_sub ### begin_: end perl 1; __END__
tryStuffBeta
### begin_: tryStuffBeta.pm package tryStuffBeta; use strict; use warnings; use Exporter; use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $VERSION); use vars qw( $PermaLink $OppositePermaLink ); $VERSION = 1.00; # Or higher @ISA = qw(Exporter); use tryStuffAlpha; ### begin_: init vars $PermaLink = "PERMALINK-BETA\n"; $OppositePermaLink = "BOppositeLink=" .$tryStuffAlpha::Permalink. +"\n"; ### begin_: subroutines push @EXPORT_OK, qw( SayHello ); sub SayHello { my $strOut; $strOut = "Beta Says Hello World! \n"; return $strOut; }###end_sub push @EXPORT_OK, qw( SayOpposite ); sub SayOpposite { my $strOut; $strOut = "Say Opposite Beta =".tryStuffAlpha::SayHello(); return $strOut; }###end_sub ### begin_: end perl 1; __END__
tryStuff_Caller
### begin_: tryStuff_Caller.pl use strict; use warnings; use tryStuffAlpha; ### <a href="./tryStuffAlpha.pm" /> use tryStuffBeta; ### <a href="./tryStuffBeta.pm" /> ### begin_: main print "1: ". tryStuffAlpha::SayHello(); ### OK print "2: ". tryStuffBeta::SayHello(); ### OK print "3: ". tryStuffAlpha::SayOpposite(); ### OK print "4: ". tryStuffBeta::SayOpposite(); ### OK print "5: ". $tryStuffAlpha::PermaLink; ### OK print "6: ". $tryStuffBeta::PermaLink; ### OK print "7: ". $tryStuffAlpha::OppositePermaLink; ### FAILS print "8: ". $tryStuffBeta::OppositePermaLink; ### FAILS
### Run Result Alpha (tryStuffAlpha.pm run all by itself) Use of uninitialized value ... at tryStuffAlpha.pm line 29. Use of uninitialized value ... at tryStuffBeta.pm line 29. Subroutine SayHello redefined ... tryStuffAlpha.pm line 35. Subroutine SayOpposite redefined ... tryStuffAlpha.pm line 42. Use of uninitialized value ... tryStuffAlpha.pm line 29. ### Run Result Beta (tryStuffBeta.pm run all by itself) Use of uninitialized value ... at tryStuffBeta.pm line 29. Use of uninitialized value ... at tryStuffAlpha.pm line 29. Subroutine SayHello redefined ... tryStuffBeta.pm line 35. Subroutine SayOpposite redefined ... tryStuffBeta.pm line 42. Use of uninitialized value ... tryStuffBeta.pm line 29. ### Run Result Caller (tryStuff_Caller.pm run all by itself) Use of uninitialized value in concatenation (.) or string at tryStuffB +eta.pm line 29. Use of uninitialized value in concatenation (.) or string at tryStuffA +lpha.pm line 29. 1: Alpha Says Hello World! 2: Beta Says Hello World! 3: Say Opposite Alpha =Beta Says Hello World! 4: Say Opposite Beta =Alpha Says Hello World! 5: PERMALINK-ALPHA 6: PERMALINK-BETA 7: AOppositeLink= 8: BOppositeLink=
The main question is what is the proper syntax to get the two modules Alpha and Beta to share their scalar variable with each other? What is the reason for the subroutine 'redefined' warnings? What is the way to make all the 'redefined' warnings go away when the modules are run separately? This is apparently a very simple problem of variable scope, any clarification on this issue is welcome.
In reply to Sharing variables and subroutines between modules: unexpected warnings and errors. by dimar
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |