Someone asked on IRC today what's a nice simple module to use for config files. Someone suggest YAML. Jeez, talk about not simple. And YAML is actually hard to write by hand. Someone else suggested XML with XML::Simple. Same thing - a large complex module and the config format isn't particularly user editable. No disrespect meant to those who suggested those things - I just think differently...
All you usually need is INI files. Here's a simple parser I often use:
sub parse_config {
my ($self, $file) = @_;
open(my $fh, $file) || die "open($file): $!";
my @lines = <$fh>;
close $fh;
chomp(@lines);
my $config = $self->{config} = {};
my $section;
for (@lines) {
s/^\s*//;
s/\s*$//;
next unless/\S/;
next if/^#/;
if (/^ \[ (.*) \] $/x) {
$section = $config->{uc$1} = {};
}
elsif (/^ (\w+) \s* = \s* (.*) $/x) {
die "key=value pair outside of a section" unless $section;
$section->{lc$1} = $2;
}
else {
die "invalid line in $file: $_";
}
}
}
It's nice and simple, requires no external modules or CPAN downloads, and works pretty well for most situations where simple config files are needed.
So many to choose from (Score:1)
I've come to like using Catalyst::Plugin::ConfigLoader as a straightforward way of getting a text config into a hash.
C::P::CL is built on top of the excellent Config::Any, so you can use
Unfortunately, C::P::CL is built into Catalyst, so I (plug) wrote a factored out version called Config::JFDI
If you're not afraid of a few dependencies, then you should give Config: [cpan.org]
I tend to agree (Score:2)
In my experience, YAML is a read-only format. It's probably just that I haven't used it enough but every time I try to hand craft YAML I get bitten by the subtleties.
I had a brief flirtation with XML and a config file format some years ago and I still paying the price :-)
I've used hand-rolled parser code for ini-style configs a number of times recently. I haven't bothered with implementing [sections] but often need to include multi-value items. The way I tend to handle that is by putting an '@' prefi
Re: (Score:2)
@JAPH = qw(Hacker Perl Another Just);
print reverse @JAPH;
My favorite configuration format is (Score:1)
Re: (Score:1)
Config::Tiny (Score:1)
Or alternatively, cut and past Config::Tiny into your code as Module::Config.
Re: (Score:2)
Re: (Score:1)
s/^\s*//;
s/\s*$//;
Surely you never want to match 0 spaces, so why not use s+? (That's an English ?, not a Perl one).
Re: (Score:1)
s/^\s*something//;
Re: (Score:2)