use Config::IniHash; $config = ReadINI( 'Service.ini', systemvars => 0, # do not expand system %variables% case => 'preserve', # lookup is case insensitive. keys %$INI return the original case # ! if you change this option to a case sensitive one even the %section-name% variables will be case sensitive ! forValue => sub { my ($name, $value, $sectionname, $INI) = @_; $value =~ s/%(\w+)-(\w+)%/$INI->{$1}->{$2}/g; return $value; }, ); use Data::Dumper; print Dumper($config);