use strict; use warnings; use Data::Dump::Streamer; my %files; $files{wibble} = <<'END_FILE'; Name=foo Icon=bar Categories=a;b;c END_FILE $files{floop} = <<'END_FILE'; Name=baz Icon=boo Categories=x;y;z END_FILE my %collection; for my $file (keys %files) { open my $inFile, '<', \$files{$file} or die "Can't open $file: $!"; my %collect; while (my $line = <$inFile>){ chomp $file; my ($var, $value) = split '=', $line, 2; $collect{$var} = $value if defined $value; } $collect{categories} ||= "Misc"; $collect{icon} ||= "-"; $collection{$file} = \%collect; } Dump \%collection; #### $HASH1 = { floop => { Categories => "x;y;z\n", categories => 'Misc', Icon => "boo\n", icon => '-', Name => "baz\n" }, wibble => { Categories => "a;b;c\n", categories => 'Misc', Icon => "bar\n", icon => '-', Name => "foo\n" } };