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

Hello, perlmonks... I was wondering what the most efficient way to parse a config file for a script would be other than...
#!/usr/bin/perl -w # # use strict; open(FILE,"</etc/config") || die "Could not open /etc/config:$!\n"; while(<FILE>) { if (/^param/i){ ..... } elsif (..... } elsif (....... } }

Replies are listed 'Best First'.
Re: parsing config file
by maverick (Curate) on Aug 19, 2001 at 23:58 UTC
    There are TONS of modules on CPAN to do various 'config file' manipulation. It all depends on what kind of config file you have (or want to make).

    To name a few there's:

    I have personally used Config::General and have been quite happy with it.

    /\/\averick
    perl -l -e "eval pack('h*','072796e6470272f2c5f2c5166756279636b672');"

      without using a module :)
        >> without using a module :)

        Here's one way ;-)

        #! perl -w use strict; # your code goes here ...
        Rudif
        The "no module" requirement makes this sound like a home work assignment. ..Tell you what, register yourself and tell me why you can't use a module, and I'll tell you a way how to do it.

        /\/\averick
        perl -l -e "eval pack('h*','072796e6470272f2c5f2c5166756279636b672');"

Re: parsing config file
by footpad (Abbot) on Aug 20, 2001 at 01:00 UTC

    You might be interested in this node, where I posed a similar question. Be aware, though, that others prefer CPAN modules whenever possible--usually because a) the hard work's done, b) they're already tested, and c) the price is right.

    I understand there are lots of reasons not to use modules (CPAN or otherwise); I just don't think there are many good ones.

    --f

      thx, and btw was not for a homework assignment I just like doing stuff without them first ;)
        In that case, here is the solution I have for you. Please forgive me for my mistaken assumption...
        #!/usr/bin/perl use strict; use Data::Dumper; # the configuration parameters along with their defaults my %config = ('key1' => 'default1', 'key2' => 'default2', 'key3' => undef ); while (<DATA>) { next if /^\s*#/; # skip lines that start with # (comments) next if /^\s*$/; # skip blank lines s/^\s*//; # remove leading whitespace s/\s*$//; # remove trailing whitespace # separate the parameter from the value ' = ' my ($k,$v) = split(/\s*=\s*/,$_,2); if (exists($config{$k})) { $config{$k} = $v; } else { print "Config file contains a bad key: k\n"; } } # verify that the required info has been supplied while (my ($k,$v) = each %config) { unless (defined($v)) { print "$k needs to be set\n"; } } print Dumper \%config; __DATA__ # some comment key1 = set to 1 some_bogus_key = some_bogus_value
        Will give you this output.
        Config file contains a bad key: some_bogus_key key3 needs to be set $VAR1 = { 'key1' => 'set to 1', 'key2' => 'default2', 'key3' => undef };

        /\/\averick
        perl -l -e "eval pack('h*','072796e6470272f2c5f2c5166756279636b672');"