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

I'm used to having a CONFIG section in each of my scripts but when my projects get to be like 10 separate files I think enough is enough and this is when I want to create a main config file and call it from within my scripts.

This is the first time I've ever tried to use a config file like this and naturally it doesn't work.

In my login.pl script I have

require("config.pl") or die "error: $!";
In my config.pl script (which is in the same folder, I have
####### # MySQL section ####### my $dbase = "estre_test"; my $mysql_user = "estre_admin"; my $mysql_pass = "pass";
And it errors out with
Global symbol "$dbase" requires explicit package name at login.pl line + 32. Global symbol "$mysql_user" requires explicit package name at login.pl + line 32. Global symbol "$mysql_pass" requires explicit package name at login.pl + line 32. Execution of login.pl aborted due to compilation errors.
I'm not sure what I'm doing wrong. The OR DIE isn't catching so I'm assuming it can find the file BUT I used a filename that I knew didn't exist and it DID NOT FAIL. So I have absolutely no idea what's wrong. All the files are in the same folder and chmoded to 755.

Can you my variables in a central config file (that's what I'm trying to do)?.

Thanks for your help

Replies are listed 'Best First'.
Re: requiring files
by Animator (Hermit) on Feb 15, 2005 at 20:49 UTC

    Well, the problem with this approach is that you need to define the variables in the main script (login.pl) this is because you are using strict... (and no, this does not mean you should drop strict).

    In login.pl, add: use vars qw/$dbase $mysql_user $mysql_pass/;

    Also you should add 1; at the end of the config.pl.

    If you really don't want to add 'use vars' and such, then you should consider making it a module and using the export/import routines...

    Something like (note, filename should change to Config.pm, and the require line should change to 'use Config':

    package Config; use Exporter; use vars qw/$dbase $mysql_user $mysql_pass/; # You could also use 'our + $dbase' etc, but our does more then 'use vars'... @ISA = qw/Exporter; @EXPORT = qw/$dbase $mysql_user $mysql_pass/ $dbase = "..."; # or our $dbase if you left out 'use vars' # other vars 1;

    (updated: added the code for exporter)

    update: you should add the 'use vars'-code to every file in which you have 'require config.pl' and 'use strict'... (which is why IMHO it isn't a very good approach)

      Thanks for your help.

      I added "use vars" as you said and it did load the main page but everything else fails. I have 2 login scripts that are using the config codes and they both load the initial form to login but submitting ANYTHING creates an ISE 500 error (even when fatalsToBrowser should be running). So it's definitely messing up my scripts and it looks like having separate config sections at the top of all these scripts would be better and more reliable then having just one config.pl to edit :(

        After more testing I found out that the variables don't seem to be sendining.

        The use vars and the require() are both on the top of the script. I tossed in a " print "test $dbase $mysql_user $mysql_pass";" line after my header on one of the login scripts and it only prints the word "test".

        So it would seem even though the variables are defined in the scripts, they aren't being set.

        Any ideas?

Re: requiring files
by holli (Abbot) on Feb 15, 2005 at 22:09 UTC
Re: requiring files
by RazorbladeBidet (Friar) on Feb 15, 2005 at 20:41 UTC
    Try using our instead. At least, that's what I do.

    Update:
    Although I usually "use" other files (though they are simply pl's acting as pm's but without the package declaration).

    Not sure if require-ing will change things