use warnings; use strict; my %vars; while () { chomp; s/\$(\w+)/exists $vars{$1} ? $vars{$1} : die "Error: no env var $1\n"/ge; my ($key, $value) = split(/=/, $_); $vars{$key} = $value; } use Data::Dumper; $Data::Dumper::Sortkeys=1; print Dumper(\%vars); __DATA__ V1=/home/user V2=$V1/test V3=$V2/file.txt #### $VAR1 = { 'V1' => '/home/user', 'V2' => '/home/user/test', 'V3' => '/home/user/test/file.txt' };