use Data::Dumper; my $query; while () { if (s/^Query=\s*//) { my $save = $_; process($query); } $query = { query_line => $save }; } elsif (m/(\d+)\s*letters/) { $query->{letters} = $1; } elsif (m/^gi/) { push(@{$query->{gi_lines}}, $_); } } process($query); sub process { print Dumper($_[0]); # for now }