SYNOPSIS
Config::Basic
A basic config parser
for
file where a section start at first column and end
when
a new section appear
METHODS
OO interface
new
Create a new parser
"-sections" = an ARRAY with all possible section "-target" a file name to parse or a ref ARRAY with the data to parse "-data" is a synonym of "-target" "-file" is a synonym of "-target"
t "-traillers" is an ARRAY with all regular expresiion allowed for a trailler (to skip in the preceding section ) "-headers" is an ARRAY with all regular expresiion allowed for a headers (to add to the following section)
the trailler and headers could be retrived into the parsed data these 2 parameters are optionals
my $a = Config::Basic->new( -data => \@data, -sections => [ 'global', 'listen', 'defaults' ], );
target
get/set the target in
use
my
$target
=
$a
->target( ) ;
# return the current target
my
$target
=
$a
->target(
"new.cfg"
) ;
# change the target to the file "new.cfg"
# and return the new target (here the file name)
my
$target
=
$a
->target( \
@data
);
# change the target to the a ARRAY ref
# and return the new target (here the ARRAY ref)
sections
get/set the sections to
use
my
$sect
=
$a
->sections( ) ;
# return a ARRAY ref with the current sections
my
$new_sect
=
$a
->sections( [
'all'
,
'server'
] );
# create a new set of sections and
# return a ARRAY ref with the current sections
traillers
get/set the traillers to skip
if
at the end of a section, lines match one of these REGEX
these lines are not include in the section.
This allow to keep blank line and comment inside a section
and get the real ending of the section (e.g. to allow an insert)
my
$sect
=
$a
->trailler( ) ;
# return a ARRAY ref with the current traillers
my
$new_sect
=
$a
->trailler( [
'^\s*$'
,
'^#'
] ) ; # create a new set of traillers and
# return a ARRAY ref with the current traillers
traillers
get/set the headers to at
if
before
of a section, lines match one of these REGEX
these lines are add in the section (under the tag
"start_headers"
).
This allow to keep comment to belong to a following section
and get the real starting of the section (e.g. to allow an insert)
my
$sect
=
$a
->header( );
# return a ARRAY ref with the current headers
my
$new_sect
=
$a
->headers( [
'^\s*$'
,
'^#'
] ) ; # create a new set of headers and
# return a ARRAY ref with the current headers
get_section
method to retrieve a section.
the method expect a
ref
to a HASH
with
{
start
=>
"start_line"
,
end
=>
"end_line"
}
my
$se
=
$a
->get_section(
$res
->{
listen
}[1] );
# return 3 elements:
start line (sithout headers)
end line (without traillers)
ARRAY
ref
with
the content of the section
parse
method to parse a target
the method
return
a
ref
to a HASH.
Each key are a section.
Each value contain a
ref
to an ARRAY
with
a
ref
to a HASH
for
each
section seen in the target
There are
for
key in
each
section descrition
start = the line where the section start
end = the line where the section end without the traillers part
if
defined
start_header = the line where the section start included the header
if
defined
end_trailler = the line where the section end
with
the traillers part
if
defined
my
$se
=
$a
->get_section(
$res
->{
listen
}[1] );
# return ARRAY ref with the content of the second section 'listen'
EXAMPLES
Parse a file like this (named here test1.cfg)
###########################################################################
global
daemon
max 10000
log
127.0.0.1 local0 notice
pidfile /var/run/running.pid
nbproc 2
defaults
mode application
option dontlognull
option closeonexit
retries 1
contimeout 5000
#
special extra value
# comment 1
item 1
#comment 2
#
item 2
#####
# test header
#####
server 192.168.1.2
log
global
option test
type ping 750
server 192.168.1.3
log
local
option test
type udp 800
## other
server 192.168.1.5
log
global
option test2
type tcp 4000
###########################################################################
## First example: ##
#!/usr/bin/perl
use
strict;
use
Config::Basic;
use
Data::Dumper;
use
Config::General;
"#"
x 30;
"\n First example\n"
;
"#"
x 30;
"\n"
;
my
$data_file
=
"test1.cfg"
;
# Instantiate a new Config::Basic object
# the input file is "test1.cfg"
# we expect 3 sections tag
# and each trailling part of the section matching one of the regular "traillers" REGEX is skipped
# this allow to skip trailling blank line or comment at the end,
# but keep blank line and comment inside the section
my
$a
= Config::Basic->new(
-file
=>
$data_file
,
-sections
=> [
'global'
,
'server'
,
'defaults'
,
'special'
],
-traillers
=> [
'^\s*$'
,
'^#'
],
-headers
=> [
'^#'
],
);
"\nPrint the 'sections' set\n"
;
Dumper(
$a
->sections );
"\nPrint the parsed data\n"
;
"look at the value start_headers and end_traillers\n"
;
"for the section 'special' and the first section 'server'\n"
;
my
$res
=
$a
->parse();
Dumper(
$res
);
my
$se
=
$a
->get_section(
$res
->{ server }[1] );
"\nPrint Config::General result for the second 'server' section\n"
;
my
%re
= ParseConfig(
-String
=>
$se
);
Dumper( \
%re
);
"\nSet a new sections set and print it\n"
;
Dumper(
$a
->sections( [
'global'
,
'server'
,
'special'
,
'defaults'
] ) );
"\nParse the data and print\n"
;
$res
=
$a
->parse();
Dumper(
$res
);
"\nExtract the second firts 'server'\n"
;
$se
=
$a
->get_section(
$res
->{ server }[0] );
Dumper(
$se
);
"\nPrint the 'traillers' set\n"
;
$se
=
$a
->traillers( );
Dumper(
$se
);
"\nPrint the 'headers' set\n"
;
$se
=
$a
->headers( );
Dumper(
$se
);
"\n"
;
"#"
x 30;
"\n Second example\n"
;
"#"
x 30;
"\n"
;
use
IO::All;
my
@data
= io(
$data_file
)->
chomp
->slurp;
my
$a
= Config::Basic->new(
-file
=> \
@data
,
-sections
=> [
'global'
,
'server'
,
'defaults'
],
-traillers
=> [
'^\s*$'
,
'^#'
],
);
my
$res
=
$a
->parse();
# Get the second 'server' section and use start , end and real data
my
(
$start
,
$end
,
$sect
) =
$a
->get_section(
$res
->{ server }[1] );
# set the line counter to the start of the section
my
$line_nbr
=
$start
;
foreach
my
$line
( @{
$sect
} )
{
# increment the line counter
$line_nbr
++;
# made some test onthe line data
if
(
$line
=~ /type/ )
{
"$line_nbr $line\n"
;
# directly modify the line in the real data
$data
[
$line_nbr
-1 ] =~ s/udp/UDP/;
}
}
# show the result (or save, or ...)
Dumper( \
@data
);
AUTHOR
Fabrice Dulaunoy <fabrice[at]dulaunoy[dot]com>
07 december 2006
LICENSE
Under the GNU GPL2
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Config::Basic Copyright (C) 2006,2007 DULAUNOY Fabrice. Config::Basic comes with ABSOLUTELY NO WARRANTY; for details See: http://www.gnu.org/licenses/gpl.html This is free software, and you are welcome to redistribute it under certain conditions;
1 POD Error
The following errors were encountered while parsing the POD:
- Around line 574:
=end readme without matching =begin. (Stack: [empty])