1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
|
#!/usr/bin/perl -w
package ConfigFile;
use strict;
use Carp;
use Exporter;
our ($VERSION, @ISA, @EXPORT_OK);
@ISA = qw/Exporter/;
@EXPORT_OK = qw/read_config_file/;
$VERSION='1.2.1';
sub read_config_file($) {
my ($line, $Conf, $file);
$file = shift;
open(CONF, "< " . $file) ||
croak "Can't read configuration in $file: $!\n";
while(<CONF>) {
my ($conf_ele, $conf_data);
chomp;
next if m/^\s*#/;
$line = $_;
$line =~ s/(?<!\\)#.*$//;
$line =~ s/\\#/#/g;
next if $line =~ m/^\s*$/;
$line =~ s{\$(\w+)}{
exists($Conf->{$1}) ? $Conf->{$1} : "\$$1"
}gsex;
$line =~ m/\s*([^\s=]+)\s*=\s*(.*?)\s*$/;
($conf_ele, $conf_data) = ($1, $2);
unless ($conf_ele =~ /^[\]\[A-Za-z0-9_-]+$/) {
warn "Invalid characters in key $conf_ele - Ignoring";
next;
}
$conf_ele = '$Conf->{' . join("}->{", split /[][]+/, $conf_ele) . "}";
$conf_data =~ s!([\\\'])!\\$1!g;
eval "$conf_ele = '$conf_data'";
}
close CONF;
return $Conf;
}
1;
__END__
=pod
=head1 NAME
ConfigFile - Parse a simple configuration file
=head1 SYNOPSIS
use ConfigFile;
my $config_hash = ConfigFile::read_config_file($configuration_file);
=head1 NOTES
In versions up to 1.0, the function read_config_file was exported to the
calling program's namespace - Starting in version 1.1, nothing is exported
by default. You can either fully qualify read_config_file or explicitly
import it into your namespace:
=head2 Fully qualifying read_config_file
use ConfigFile;
my $config_hash = ConfigFile::read_config_file($configuration_file);
=head2 Explicitly importing read_config_file
use ConfigFile qw(read_config_file);
my $config_hash = read_config_file($configuration_file);
=head1 DESCRIPTION
C<read_config_file> parses a simple configuration file and stores its
values in an anonymous hash reference. The syntax of the configuration
file is quite simple:
# This is a comment
VALUE_ONE = foo
VALUE_TWO = $VALUE_ONE/bar
VALUE_THREE = The value contains a \# (hash). # This is a comment.
Options can be clustered when creating groups:
CLUSTER_ONE[data] = data cluster one
CLUSTER_ONE[value] = value cluster one
CLUSTER_TWO[data] = data cluster two
CLUSTER_TWO[value] = value cluster two
Then values can be fetched using this syntax:
$hash_config->{CLUSTER_ONE}{data};
There can be as many sub-options in a cluster as needed.
BIG_CLUSTER[part1][part2][part3] = data
is fetched by:
$hash_config->{BIG_CLUSTER}{part1}{part2}{part3};
There are a couple of restrictions as for the names of the keys. First of all,
all the characters should be alphabetic, numeric, underscores or hyphens, with
square brackets allowed for the clustering. That is, the keys should conform
to /^[A-Za-z0-9_-]+$/
This means also that no space is allowed in the key part of the line.
CLUSTER_ONE[data] = data cluster one # Right
CLUSTER_ONE[ data ] = data cluster one # Wrong
=head1 Function C<read_config_file>
=head2 Syntax
ConfigFile::read_config_file($file);
=head2 Arguments
C<$file> is the configuration file.
=head2 Return value
This function returns a hash reference. Each key of the hash is a
value defined in the configuration file.
=head2 Description
C<read_config_file> parses a configuration file a sets up some values
in a hash reference.
=head1 AUTHOR
Development was started by Sebastien J. Gross <seb@sjgross.org>
All rights reserved. This program is free software; you can redistribute
it and/or modify it under the terms of the GPL.
=head1 VERSION
Version 1.2.1
Copyright (c) 2002 Sebastien J. Gross. All rights reserved.
Copyright (c) 2003 Gunnar Wolf. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GPL.
=cut
|