1

I'm trying to open a file from a Perl script and search for "Quiz 2" (which is about 65 lines into the text file). Then, from that point until "============" is found (which is at the end of each 'Quiz'), push only the lines between those two points into an Array and then search the Array for "----", which is at the end of each question, and print each question one at a time to the screen.

That's the plan, which is keeping me up at night (par for the course) :-)

Any help will be great....

open(QUIZ, "<Questions.txt");

foreach $line (<QUIZ>) {
  if ($line =~ "Quiz $QuizNumber") {
    ($dump,$Creator,$NumberOfQuestions) = split(/ !!! /,$line);
  }
} # foreach

foreach $line (<QUIZ>) {    
  if ($line =~ "=============") {
    last;
  } else {
    push(@Questions, $line);
  }
} # foreach 2

close(QUIZ);

foreach $Line (@Questions) {
  unless ($Line !~ "~~~") {
    print "<br>Line $Line";
  }
}

First foreach works fine, second doesn't, third has nothing in the Array to print
Thanks,
Nick..

Dave Cross
  • 68,119
  • 3
  • 51
  • 97
Nickalf
  • 13
  • 5
  • Have you considered using split foreach quiz and again foreach question? – BalooRM May 15 '20 at 22:34
  • Thanks for the comeback BalooRM - Yes, I first tried a foreach inside the while loop and then tried making them both foreach loops – Nickalf May 15 '20 at 22:40
  • Can you read the whole file, split the file into separate quizzes, iterate over each quiz, and split each quiz into multiple questions? – BalooRM May 15 '20 at 22:46
  • Well, did you try anything -- can we see the code and what's not working? – zdim May 15 '20 at 23:19
  • One way: Read by line, set a flag when you match that `/(Quiz\s+[0-9]+)/`, unset for a line with `=`s. Add a line to a string if flag is on. At those points when you are clearing the flag add the string to an array. – zdim May 15 '20 at 23:27
  • If there are multiple sections with quizzes, split by different markers (`-`s?), add flags for those units (questions?). Then arrays if quizzes can be added (by reference) to an array with questions, for example. – zdim May 15 '20 at 23:34
  • BalooRM: That's what I tried, just need to see some examples as mine didn't work – Nickalf May 16 '20 at 01:45
  • zdim: Thanks for the comeback - I'll try to figure out your example.. – Nickalf May 16 '20 at 01:45
  • Please add sample of data for study input data. – Polar Bear May 16 '20 at 06:42
  • Please provide sample of desired output. – Polar Bear May 16 '20 at 06:46
  • I've fixed the indentation of your code. You're very welcome, but please consider doing it yourself next time. Careful indentation is a very useful tool for helping people understand your code. And if you're asking a large number of strangers to read and understand your code then it's only polite to make that as easy as possible for them. – Dave Cross May 16 '20 at 13:41
  • Okay DC, I'll try to improve.... – Nickalf May 17 '20 at 05:39

1 Answers1

0

Perhaps the code could be as following:

Read file into variable

Split on (Quiz \d+.*?)============ into array @quizes

Loop over @quizes and extract questions with (Question #\d+)(.*?)---- into hash

Push result into hash referenced with $quizes variable

At this point you can access any Quiz and any Question of the quiz through index

NOTE: no test data provided by OP, an improvisation was taken for the code, Lorem Ipsum generator used to fill the content of the questions

use strict;
use warnings;
use feature 'say';

use Data::Dumper;

my $quizes;

my $data = do { local $/; <DATA> };
my @quizes = $data =~ /(Quiz \d+.*?)============/sg;

#say Dumper(\@quizes); exit;

for (@quizes) {
    /(Quiz \d+)/gs;
    my $id = $1;
    my %questions;
    %questions = $_ =~ /(Question #\d+)(.*?)----/sg;
    push @{$quizes->{$id}}, \%questions;
}

say Dumper($quizes);

__DATA__
Please answer every question of following quizes:

Quiz 1
Question #1
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod 
tempor incididunt ut labore et dolore magna aliqua. Eu scelerisque felis 
imperdiet proin fermentum leo vel orci. Eget mi proin sed libero enim. 
Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Sit 
amet cursus sit amet dictum sit. Nisi vitae suscipit tellus mauris a diam 
maecenas sed. Elementum facilisis leo vel fringilla est ullamcorper eget nulla. 
Duis convallis convallis tellus id interdum velit laoreet id. Sodales ut eu sem 
integer vitae justo eget magna. Nisi vitae suscipit tellus mauris a diam maecenas 
sed enim. Non pulvinar neque laoreet suspendisse interdum consectetur libero.
----
Question #2
Accumsan lacus vel facilisis volutpat est velit egestas. Libero 
nunc consequat interdum varius sit amet mattis. Feugiat in fermentum 
posuere urna nec tincidunt praesent semper feugiat. Faucibus in ornare 
quam viverra orci sagittis eu volutpat odio. Eget nunc lobortis mattis 
aliquam faucibus. Sit amet dictum sit amet justo donec enim diam. Vel 
quam elementum pulvinar etiam non quam lacus suspendisse faucibus. 
Neque vitae tempus quam pellentesque nec nam aliquam. Magna eget est 
lorem ipsum dolor. Pellentesque habitant morbi tristique senectus et netus. 
Erat imperdiet sed euismod nisi porta lorem mollis aliquam. Ut morbi tincidunt 
augue interdum velit euismod. Feugiat in fermentum posuere urna nec. Donec 
et odio pellentesque diam volutpat commodo sed egestas.
----
============

Quiz 2
Question #1
Accumsan lacus vel facilisis volutpat est velit egestas. Libero 
nunc consequat interdum varius sit amet mattis. Feugiat in fermentum 
posuere urna nec tincidunt praesent semper feugiat. Faucibus 
in ornare quam viverra orci sagittis eu volutpat odio. 
Eget nunc lobortis mattis aliquam faucibus. Sit amet dictum sit 
amet justo donec enim diam. Vel quam elementum pulvinar etiam 
non quam lacus suspendisse faucibus. Neque vitae tempus quam 
pellentesque nec nam aliquam. Magna eget est lorem ipsum dolor. 
Pellentesque habitant morbi tristique senectus et netus. Erat 
imperdiet sed euismod nisi porta lorem mollis aliquam. Ut morbi 
tincidunt augue interdum velit euismod. Feugiat in fermentum 
posuere urna nec. Donec et odio pellentesque diam volutpat commodo 
sed egestas.
----
Question #2
Accumsan lacus vel facilisis volutpat est velit egestas. Libero 
nunc consequat interdum varius sit amet mattis. Feugiat in fermentum 
posuere urna nec tincidunt praesent semper feugiat. Faucibus in ornare 
quam viverra orci sagittis eu volutpat odio. Eget nunc lobortis mattis 
aliquam faucibus. Sit amet dictum sit amet justo donec enim diam. Vel quam 
elementum pulvinar etiam non quam lacus suspendisse faucibus. Neque vitae 
tempus quam pellentesque nec nam aliquam. Magna eget est lorem ipsum dolor. 
Pellentesque habitant morbi tristique senectus et netus. Erat imperdiet sed 
euismod nisi porta lorem mollis aliquam. Ut morbi tincidunt augue interdum 
velit euismod. Feugiat in fermentum posuere urna nec. Donec et odio 
pellentesque diam volutpat commodo sed egestas.
----
============

Output

$VAR1 = {
          'Quiz 1' => [
                        {
                          'Question #2' => '
Accumsan lacus vel facilisis volutpat est velit egestas. Libero 
nunc consequat interdum varius sit amet mattis. Feugiat in fermentum 
posuere urna nec tincidunt praesent semper feugiat. Faucibus in ornare 
quam viverra orci sagittis eu volutpat odio. Eget nunc lobortis mattis 
aliquam faucibus. Sit amet dictum sit amet justo donec enim diam. Vel 
quam elementum pulvinar etiam non quam lacus suspendisse faucibus. 
Neque vitae tempus quam pellentesque nec nam aliquam. Magna eget est 
lorem ipsum dolor. Pellentesque habitant morbi tristique senectus et netus. 
Erat imperdiet sed euismod nisi porta lorem mollis aliquam. Ut morbi tincidunt 
augue interdum velit euismod. Feugiat in fermentum posuere urna nec. Donec 
et odio pellentesque diam volutpat commodo sed egestas.
',
                          'Question #1' => '
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod 
tempor incididunt ut labore et dolore magna aliqua. Eu scelerisque felis 
imperdiet proin fermentum leo vel orci. Eget mi proin sed libero enim. 
Pulvinar mattis nunc sed blandit libero volutpat sed cras ornare. Sit 
amet cursus sit amet dictum sit. Nisi vitae suscipit tellus mauris a diam 
maecenas sed. Elementum facilisis leo vel fringilla est ullamcorper eget nulla. 
Duis convallis convallis tellus id interdum velit laoreet id. Sodales ut eu sem 
integer vitae justo eget magna. Nisi vitae suscipit tellus mauris a diam maecenas 
sed enim. Non pulvinar neque laoreet suspendisse interdum consectetur libero.
'
                        }
                      ],
          'Quiz 2' => [
                        {
                          'Question #1' => '
Accumsan lacus vel facilisis volutpat est velit egestas. Libero 
nunc consequat interdum varius sit amet mattis. Feugiat in fermentum 
posuere urna nec tincidunt praesent semper feugiat. Faucibus 
in ornare quam viverra orci sagittis eu volutpat odio. 
Eget nunc lobortis mattis aliquam faucibus. Sit amet dictum sit 
amet justo donec enim diam. Vel quam elementum pulvinar etiam 
non quam lacus suspendisse faucibus. Neque vitae tempus quam 
pellentesque nec nam aliquam. Magna eget est lorem ipsum dolor. 
Pellentesque habitant morbi tristique senectus et netus. Erat 
imperdiet sed euismod nisi porta lorem mollis aliquam. Ut morbi 
tincidunt augue interdum velit euismod. Feugiat in fermentum 
posuere urna nec. Donec et odio pellentesque diam volutpat commodo 
sed egestas.
',
                          'Question #2' => '
Accumsan lacus vel facilisis volutpat est velit egestas. Libero 
nunc consequat interdum varius sit amet mattis. Feugiat in fermentum 
posuere urna nec tincidunt praesent semper feugiat. Faucibus in ornare 
quam viverra orci sagittis eu volutpat odio. Eget nunc lobortis mattis 
aliquam faucibus. Sit amet dictum sit amet justo donec enim diam. Vel quam 
elementum pulvinar etiam non quam lacus suspendisse faucibus. Neque vitae 
tempus quam pellentesque nec nam aliquam. Magna eget est lorem ipsum dolor. 
Pellentesque habitant morbi tristique senectus et netus. Erat imperdiet sed 
euismod nisi porta lorem mollis aliquam. Ut morbi tincidunt augue interdum 
velit euismod. Feugiat in fermentum posuere urna nec. Donec et odio 
pellentesque diam volutpat commodo sed egestas.
'
                        }
                      ]
        };

Community
  • 1
  • 1
Polar Bear
  • 6,762
  • 1
  • 5
  • 12
  • Thanks PB - I'll take a look at your code.. I only need this file to be read out, don't need Answers as that's done from a separate script.. – Nickalf May 16 '20 at 01:41