• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 723
  • Last Modified:

mechanism in perl to read config-file

Hallo!

I have a config-file like:
--cut--
$filename="file.txt";
$servername="srv01";
...
--cut--

How to include this in a perl-script, so that I can access these variables from the perl-script?
is there a built-in mechanism to do this very simple?

thx
michael
0
witty
Asked:
witty
1 Solution
 
jmcgOwnerCommented:
One common method for writing configuration files for Perl scripts is to have the file consist of executable Perl statements like this example of yours. It's convenient but not secure.

To execute the statements contained in the file, you would typically use a 'require' or 'do' statement.

do "config-file.txt";
0
 
ultimatemikeCommented:
Along the lines of jmcg's answer, you could try:  (This is assuming your config file is called data.dat). As jmcg mentioned, this is probably not a very safe way of doing this, but depending on your situation, it may be fine.


As well, if you didn't use strict, you wouldn't need to declare the variables before the eval. That would likely lead to some sloppy and buggy code though.


use strict;

my $filename;
my $servername;

open FH, "data.dat";

while (<FH>) {

      eval;

}

print $filename;
print $servername;
0
 
vermeylenCommented:
The module Config::Inifiles should to this:
http://search.cpan.org/~wadg/Config-IniFiles-2.38/IniFiles.pm
0
Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

 
wittyAuthor Commented:
@jmcg:
this sounds as the easiest one.

But variables defined in this config-file are undefined in the perl-script!

any idea

thx
michi
0
 
jmcgOwnerCommented:
You don't have a 'Package' directive in this config file, do you?

Or are you saying that the 'do' gets complaints from the perl compiler because you have said 'use strict;' ???
0
 
wittyAuthor Commented:
run.pl:
--cut--
use strict;
my $var=":-(";
do "run.cfg";
print "$var\n";
--cut--

run.cfg:
--cut--
$var=":-)";
--cut--

"perl run.pl" returns ":-("

do I have to code something else in "run.cfg"

thx
michi
0
 
jmcgOwnerCommented:
Well, it _is_ a restriction of "do" and "require" that they are separate lexical scopes. Variables declared with "my" in one file are not visible to code in another file. If you change that "my" to "our", things work the way you expect.
0
 
wittyAuthor Commented:
"our" works fine!!!

but can anyone explain why:

use strict;
my $var=":-(";
do "run.cfg";
print $main::var."\n";

=> ":-)"

BUT:

use strict;
my $var=":-(";
do "run.cfg";
print $var."\n";

=> ":-("

thx
michi
0
 
jmcgOwnerCommented:
$mail::var accesses the global $var variable in your first example. By giving the fully-qualified name, you bypass the lexical $var that was declared with "my".

The second example is still getting the lexical.
0

Featured Post

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now