#!/usr/bin/perl use strict; use warnings; my %vars; my %depend; while () { chomp; if (/^\s*(\w+)\s*=\s*(?:"([^"]*)"|(.*))/) { my ($name, $val) = ($1, $+); $vars{$name} = $val; $depend{$name} = [ $vars{$name} =~ /\$(\w+)/g ]; } } expand(\%vars, \%depend); sub expand { my ($varhash, $dephash, $queue) = @_; $queue ||= [ keys %$varhash ]; # for each item in the queue for (@$queue) { # make sure its dependencies are expanded expand($varhash, $dephash, $dephash->{$_}); # then interpolate the variables in this item $varhash->{$_} =~ s/\$(\w+)/$varhash->{$1}/g; } } use Data::Dumper; print Dumper(\%vars); __DATA__ VAR1 = "say $VAR2" VAR2 = "hi $VAR3" VAR3 = jeff