my $context; my @list; while (1) { my @data = get_next_key_and_value(); if (@data) { # got an extra key/value for current hash. $context->{$data[0]} = $data[1]; } else { # end of current hash. push @list, $context; $context = undef; } }