use Data::Dumper; my (%quiz, $number); while (){ chomp; if (s/^(\d+)\. *//) { $number = $1; $quiz{$number}{question} = $_; } elsif (s/^([A-Z])\. *//) { my $option = $1; $quiz{$number}{answer} = $option if s/ *\*$//; $quiz{$number}{$option} = $_; } else { next; } } print Dumper \%quiz; __DATA__ 1. What is my name? A. Rooney * B. Gerrard C. Ronaldo D. Ronaldinho 2. Who's your bet in the coming World Cup? A. Brazil * B. Germany C. England D. Cameroon #### print $quiz{2}{$quiz{2}{answer}}; #### print '1. ',$quiz{1}{question},"\n"; for ( sort keys %{$quiz{1}} ){ print "$_. ",$quiz{1}{$_},"\n" if $_ !~ /\p{Lower}/; } #### for (sort keys %quiz) { my $number = $_; print "\n$number. $quiz{$number}{question}\n\n"; for ( sort keys %{$quiz{$number}} ){ next if /question|answer/; print "$_. $quiz{$number}{$_}\n"; } print "\nAnswer: $quiz{$number}{answer}\n"; } #### for (sort keys %quiz) { my $current = $quiz{$_}; print "\n$_. $current->{question}\n\n"; for ( sort keys %{$current} ){ next if /question|answer/; print "$_. $current->{$_}\n"; } print "\nAnswer: $current->{answer}. $current->{$current->{answer}}\n"; }