use Tie::File; use Data::Dumper; use strict; use warnings; print Dumper(foo('profile.txt')); sub foo { my (@a, %result); tie @a, 'Tie::File', shift; foreach (@a) { /(.*?)\s+(.*)/g; $result{$1} = $2 if (($1 eq 'firstname') or ($1 eq 'lastname') or ($1 eq 'middlename')); } return \%result; }