in reply to Configuration File
Use YAML! YAML is a simple, human-readable data-serialization format. It can round-trip any Perl data structure (that anything else can parse, anyway -- nothing's perfect) with no loss, doesn't require evals, and is very easy to work with.
One thing YAML's implementors had in mind at the start was to make a better syntax for config files. YAML's brutally simple in this regard:
# snippet my $data = "anything you want"; DumpFile( "/path/to/file", $data ); my $newdata = LoadFile( "/path/to/file" ); # now $data == $newdata
The code below is long, but that's mostly data. It dumps the data twice with Data::Dumper, before and after a YAML read/write cycle, just to prove they're the same. Lastly is the data as represented by YAML - very clean and easy to read.
And here's the output:#!/usr/bin/perl use strict; use warnings; use YAML qw/ LoadFile DumpFile Dump /; use Data::Dumper; local $Data::Dumper::Indent = 1; use constant DIV => '-' x 20 . "\n"; my $routers = { 'routers' => { 'router1' => '192.168.1.2', 'router2' => '192.168.1.3', 'router3' => '192.168.1.4', 'router4' => '192.168.1.5', 'router5' => '192.168.1.6', } }; my $groups = { 'groups' => { 'group1' => [ 'router1', 'router5', ], 'group2' => [ 'router1', 'router2', 'router3', ], 'group3' => [ 'router2', 'router3', 'router4', ] } }; print "Dumping initial data...\n" . DIV; print Dumper $routers, $groups; print "Writing YAML file...\n"; DumpFile( "./yaml-test.conf", $routers, $groups ); print "Reading YAML file...\n"; ( $routers, $groups ) = LoadFile( "yaml-test.conf" ); print "Dumping YAML'd data...\n" . DIV; print Dumper $routers, $groups; print "Dumping YAML'd data with YAML...\n" . DIV; print Dump $routers, $groups;
Dumping initial data... -------------------- $VAR1 = { 'routers' => { 'router5' => '192.168.1.6', 'router1' => '192.168.1.2', 'router3' => '192.168.1.4', 'router4' => '192.168.1.5', 'router2' => '192.168.1.3' } }; $VAR2 = { 'groups' => { 'group2' => [ 'router1', 'router2', 'router3' ], 'group1' => [ 'router1', 'router5' ], 'group3' => [ 'router2', 'router3', 'router4' ] } }; Writing YAML file... Reading YAML file... Dumping YAML'd data... -------------------- $VAR1 = { 'routers' => { 'router5' => '192.168.1.6', 'router1' => '192.168.1.2', 'router3' => '192.168.1.4', 'router4' => '192.168.1.5', 'router2' => '192.168.1.3' } }; $VAR2 = { 'groups' => { 'group2' => [ 'router1', 'router2', 'router3' ], 'group1' => [ 'router1', 'router5' ], 'group3' => [ 'router2', 'router3', 'router4' ] } }; Dumping YAML'd data with YAML... -------------------- --- #YAML:1.0 routers: router1: 192.168.1.2 router2: 192.168.1.3 router3: 192.168.1.4 router4: 192.168.1.5 router5: 192.168.1.6 --- #YAML:1.0 groups: group1: - router1 - router5 group2: - router1 - router2 - router3 group3: - router2 - router3 - router4
|
|---|