in reply to shared variables

If you define a variable as 'my' in another file, you CAN NOT get to it from outside that file. That's what lexical scoping means. You don't want lexical scoping here.

Jeff japhy Pinyan, P.L., P.M., P.O.D, X.S.: Perl, regex, and perl hacker
How can we ever be the sold short or the cheated, we who for every service have long ago been overpaid? ~~ Meister Eckhart

Replies are listed 'Best First'.
Re^2: shared variables
by Anonymous Monk on Mar 14, 2006 at 10:08 UTC
    Hi Jeff, thanks very much for your reply. I tried removing the 'my' definition in the testlib.pl but I continually get the message
    Global symbol "$var" requires explicit package name at ./test.pl line +10. Execution of ./test.pl aborted due to compilation errors.
    Now everything I read seems to point me in the direction of making a module for this, and not having ever made a module I will probably do this anyway for practice, but I'm always concerned if something 'should' work, but doesn't then it still leaves a large gap in my understanding. I'd be grateful if you could help me understand what is going wrong before I move on. Thanks.
      The reason why you get the message is because $var is not defined in test.pl, so you need to explicitly tell Perl which module (package) you want it to look in for $var. The program will work if you define testlib.pl as:
      package testlib; our $var = "Lord only knows if this will work..."; 1;
      and change the print statement in test.pl to: print $testlib::var;

      Now, if you want to do things the recommended way by using a proper module you can do it like this:

      # testlib.pm package testlib; use strict; our @EXPORT = qw( $var ); #place all the variables you want to export +by default in here (c.f. @EXPORT_OK) use Exporter; our @ISA = qw(Exporter); our $var = "Lord only knows if this will work..."; 1;
      #!/usr/bin/perl -w # test.pl use strict; use CGI::Carp qw(fatalsToBrowser warningsToBrowser); use CGI ':standard'; use testlib; # will automagically import $var into current namespace print "Content-type: text/html\n\n"; print $var; exit;
      -imran
        That's brilliant, imran. I appreciate the time and effort you've put in to show me the way. If I had a vote I would ++ you but I hope others take note and do it for me!! :)