use strict; use warnings; use Data::Dumper; sub filter_and_return_ref { my $in = shift; my @lines = split /\n/, $in; for ( @lines ) { s{ \A (\S+) }{$1 =>}xms; $_ .= ','; } unshift @lines, '{'; push @lines, '}'; return eval join q{}, @lines; } my $unfiltered = <<'END_OF_UNFILTERED'; key1 "value1" key2 "value2" key3 "value3" END_OF_UNFILTERED ; my $data_ref = filter_and_return_ref( $unfiltered ); print Dumper $data_ref; __END__ $VAR1 = { 'key2' => 'value2', 'key1' => 'value1', 'key3' => 'value3' };