Reading Configuration Files
Problem
You want to allow the users of your program to change its behavior through configuration files.
Solution
Either process a file in trivial VAR=VALUE format, setting a hash key-value pair for each setting:
while (<CONFIG>) {
chomp; # no newline
s/#.*//; # no comments
s/^\s+//; # no leading white
s/\s+$//; # no trailing white
next unless length; # anything left?
my ($var, $value) = split(/\s*=\s*/, $_, 2);
$User_Preferences{$var} = $value;
}Or better yet, treat the config file as full Perl code:
do "$ENV{HOME}/.progrc";Discussion
The first solution lets you read in config files in a trivial format like this (comments and blank lines are allowed):
# set class C net
NETMASK = 255.255.255.0
MTU = 296
DEVICE = cua1
RATE = 115200
MODE = adaptiveAfter you’re done, you can pull in a setting by something like
$User_Preferences{"RATE"} to find the value
115200. If you wanted the config file to directly set a variable in
your program using that name, instead of assigning to the hash, do
this:
no strict 'refs'; $$var = $value;
and the $RATE variable would contain 115200.
The second solution uses do
to
pull in raw Perl code directly. When used with an expression instead
of a block, do interprets the expression as a
filename. This is nearly identical to using
require, but without risk of taking a fatal
exception. In the second format, the config file would look like:
# set class C net $NETMASK = '255.255.255.0'; $MTU = 0x128; # Brent, please turn on the modem $DEVICE ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access