use Data::Dumper; my %envron; while () { chomp; my ($key, $value) = /(.+)=(.*)/; next unless defined $key; $value =~ s/\$(\w+)/$environ{$1}/g; $environ{$key} = $value; } print Data::Dumper->Dump([\%environ], ["*environ"]); __DATA__ myfile=test.log mydir=/kelly/$myfile longdir=/$myfile$mydir __OUTPUT__ %environ = ( 'longdir' => '/test.log/kelly/test.log', 'mydir' => '/kelly/test.log', 'myfile' => 'test.log' );