#!/usr/bin/perl use warnings; use strict; use Data::Dumper; my $VARNAME = qr/[A-Z_][A-Z_0-9]*/; my %env; while (<>) { if (/^($VARNAME)="(.*)"$/) { $env{$1} = $2; } elsif (/^($VARNAME=")$/) { my $var = $1; my @val; my $line; until (($line = <>) =~ /"/) { chomp $line; push @val, $line; } $line =~ s/".*//s; push @val, $line; $env{$var} = \@val; } else { warn "Invalid line $.\n"; } } while (my ($key, $value) = each %env) { if (ref $value) { s/\$($VARNAME)/$env{$1}/g for @$value; } else { $value =~ s/\$($VARNAME)/$env{$1}/g; } $env{$key} = $value; } print Dumper \%env;