The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

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;
        
        print "#" x 30;
        print "\n First example\n";
        print "#" x 30;
        print "\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 => [ '^#' ],
        );
        
        print "\nPrint the 'sections' set\n";
        print Dumper( $a->sections );
        
        print "\nPrint the parsed data\n";
        print "look at the value start_headers and end_traillers\n";
        print "for the section 'special' and the first section 'server'\n";
        my $res = $a->parse();
        print Dumper( $res );
        
        my $se = $a->get_section( $res->{ server }[1] );
        
        print "\nPrint Config::General result for the second 'server' section\n";
        my %re = ParseConfig( -String => $se );
        print Dumper( \%re );
        
        print "\nSet a new sections set and print it\n";
        print Dumper( $a->sections( [ 'global', 'server', 'special', 'defaults' ] ) );
        
        
        print "\nParse the data and print\n";
        $res = $a->parse();
        print Dumper( $res );
        
        
        print "\nExtract the second firts 'server'\n";
        $se = $a->get_section( $res->{ server }[0] );
        print Dumper( $se );
        
        
        print "\nPrint the 'traillers' set\n";
        $se = $a->traillers( );
        print Dumper( $se );
        
        print "\nPrint the 'headers' set\n";
        $se = $a->headers( );
        print Dumper( $se );
        
        
        print "\n";
        print "#" x 30;
        print "\n Second example\n";
        print "#" x 30;
        print "\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/ )
            {
                print "$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  ...)
        print 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])