Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Hi, I've got a couple of variables which keep cropping up so I thought I'd put them in a file which can be called up by any script that needs them.
testlib.pl: my $var = "Lord only knows if this will work..."; 1;
then test.pl calls up the library:
#!/usr/bin/perl -w use strict; use CGI::Carp qw(fatalsToBrowser warningsToBrowser); use CGI ':standard'; require 'testlib.pl'; print "Content-type: text/html\n\n"; print "$var"; exit;
Any help in knowing what I should have done...

Replies are listed 'Best First'.
Re: shared variables
by CountOrlok (Friar) on Mar 13, 2006 at 14:45 UTC
    Try:
    our $var = "Lord only knows if this will work..."; 1;
    in your testlib.pl file.
    -imran
    P.S. There are better ways to tackle this though (by using modules that export variables).
Re: shared variables
by japhy (Canon) on Mar 13, 2006 at 15:40 UTC
    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
      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
Re: shared variables
by gzayzay (Sexton) on Mar 13, 2006 at 15:19 UTC
    Here is what I think you should do.

    In testlib.pl, write:

    $| = 1; sub test{ $var = "Lord only knows if this will work..."; } 1;

    In your main program, write.

    require 'testlib.pl'; $| = 1; print "Content-type: text/html\n\n"; test(); print "$var"; exit;