By maintaining config data in a hash,you can not only quickly access key-value pairs,but also maintain more complex data. For example,%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' ); Maintaining config data in Perl syntax makes it easy to read: # 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); } The config data is easy to access in its own namespace: # 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); } The Data::Dumper module lets you write config data easily: 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); } The syntax of the config file can be easily checked using: perl -c my_cfg.cfg |