%CFG = ( 'servers' => { 'SRV1' => { 'IP' => 99.32.4.0, 'user' => 'aname', 'pswd' => 'p4ssw0rd', 'status' => 'unavailable' }, 'SRV2' => { 'IP' => 129.99.10.5 'user' => 'guest', 'pswd' => 'guest' 'status' => 'unavailable' } }, 'timeout' => 60, 'log' => { 'file' => '/var/log/my_log.log', 'level' => 'warn', }, 'temp' => 'remove me' ); #### # Read a configuration file # The arg can be a relative or full path, or # it can be a file located somewhere in @INC. sub ReadCfg { my $file = $_[0]; our $err; { # Put config data into a separate namespace package CFG; # Process the contents of the config file my $rc = do($file); # Check for errors if ($@) { $::err = "ERROR: Failure compiling '$file' - $@"; } elsif (! defined($rc)) { $::err = "ERROR: Failure reading '$file' - $!"; } elsif (! $rc) { $::err = "ERROR: Failure processing '$file'"; } } return ($err); } # Get our configuration information if (my $err = ReadCfg('my_cfg.cfg')) { print(STDERR $err, "\n"); exit(1); } #### # Add last access time $CFG::CFG{'servers'}{'SRV1'}{'last_access'} = time(); # Change server availablility $CFG::CFG{'servers'}{'SRV1'}{'status'} = 'online'; # Delete temporary data delete($CFG::CFG{'temp'}); # Open log file my $LOG; if (! open($LOG, "> $CFG::CFG{'log'}{'file'}")) { print(STDERR "ERROR: Failure opening log file: $!\n"); exit(1); } #### use Data::Dumper; # Save configuration data # Use the same arg as used with ReadCfg() # so that file can be found in the %INC. sub SaveCfg { my $file = $INC{$_[0]}; my $CFG; if (! open($CFG, "> $file")) { return ("ERROR: Failure opening '$file' - $!"); } print $CFG <<_MARKER_; ##### # # My configuration file # ##### use strict; use warnings; our (%CFG); # The configuration data @{[Data::Dumper->Dump([\%CFG::CFG], ['*CFG'])]} 1; # EOF _MARKER_ close($CFG); return (undef); # Success } # Save our configuration file if (my $err = SaveCfg('my_cfg.cfg')) { print(STDERR $err, "\n"); exit(1); } #### perl -c my_cfg.cfg