http://www.perlmonks.org?node_id=768996


in reply to require, globals, and some various mayhem

What you're missing is that those aren't globals. Variables declared with my() are lexical, not global, and the reason it works when the subs are defined within the same script is that the lexical variables and the sub are in the same scope.

What you should do is pass the variables to the sub. However, your globals approach will work, provided you declare the variables with our() instead of my().

  • Comment on Re: require, globals, and some various mayhem

Replies are listed 'Best First'.
Re^2: require, globals, and some various mayhem
by GaijinPunch (Pilgrim) on Jun 06, 2009 at 06:54 UTC
    Cheers, I will try that. Any idea why it worked properly before? Maybe I hallucinated the whole thing.
      If you had them in separate files before, it couldn't have worked. Maybe you weren't running the code you thought you were.
      I suspect for this to work well, you are going to need to "use" instead of "require". I might be wrong, but I'm sure approach below will work. Here is some boiler-plate for you. Make a file called my_subs.pm, and stick modified version of this in there. The "use my_subs" will cause this .pm code to run before your program and the globals will exist.
      #file my_subs.pm use strict; use warnings; package my_subs; use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $VERSION); use Exporter; our $VERSION=1.0; our @ISA = qw(Exporter); our @EXPORT = qw(GLOBAL1, GLOBAL2, XYZZY); our @EXPORT_OK = qw(); our $GLOBAL1 = 23; our $GLOBAL2; sub XYZZY{} 1; # important!!! every .pm file must return "true", 1; is # easiest way to do that! ###### in main program ##### use my_subs; # do something with XYZZY(a,b); # my $a=$GLOBAL1 +23;