Как разобрать набор заданных проблем со случайным выбором? - PullRequest
0 голосов
/ 11 октября 2011

Привет. Я работаю над небольшим сценарием синтаксического анализа, предпочтительно на Perl, для анализа заданного набора вопросов. Всегда есть четыре вопроса (для тестирования прямо сейчас). Они отформатированы следующим образом:

Junk
Junk
Junk
(1)

How is the weather in India?
A Good
B Bad
C Terrible
(2)

Are you hungry right this second?
True
False
(3)

Which is a fruit?
A Africa
B China
C India
D Asia
E America
F Apple
G Mexico
(4)

A mystery is?
A Game
B Problem
C I don't know
D Nothing

Таким образом, шаблон такой же, сначала идет число (1), затем пробел, за которым следует вопрос. Теперь ответ может варьироваться, и я пытаюсь найти способ сохранить его согласованность. Я нашел способ убрать все вопросы и поместить их в хеш. Теперь мне нужно сохранить варианты, которые соответствуют им.

Мой код прямо сейчас может разделить содержимое выше в массив, который имеет следующее:

PRINTING ARRAY OF Q'S 
How is the weather in India?
Are you hungry right this second?
Which is a fruit?
A mystery is?

Код:

#! /usr/bin/perl
use strict;
use warnings;

open (FILE, "$ARGV[0]" );



my @questions = ();

my $flagToCapture = 0 ;
my $foundQuestion = 0 ;

while (<FILE>){

if ($flagToCapture ==2 ) {
    $flagToCapture = 0;
    chomp($_);
    push(@questions, $_);
    #inserted question into the array
    $foundQuestion = 1;
}

if ($flagToCapture == 1){
    $flagToCapture = 2;
}

if ($_ =~ m/^\(/) {
    $flagToCapture =1;
}

}

print "PRINTING ARRAY OF Q'S \n";
foreach(@questions){
    print "$_\n";
}

Ответы [ 2 ]

1 голос
/ 11 октября 2011

Я бы сделал что-то вроде:

#!/usr/bin/perl 
use strict;
use warnings;
use Data::Dump qw(dump);

my $quest;
my %QA;
while(my $line = <DATA>) {
    chomp $line;
    if ($line =~ /^\((\d+)\)$/) {
        $quest = $1;
        $QA{$quest} = [];
    } elsif ($line =~ /\S+/ && defined $quest) {
        push @{$QA{$quest}}, $line;
    }
}
dump %QA;

__DATA__
Junk
Junk
Junk
(1)

How is the weather in India?
A Good
B Bad
C Terrible
(2)

Are you hungry right this second?
True
False
(3)

Which is a fruit?
A Africa
B China
C India
D Asia 
E America
F Apple
G Mexico
(4)

A mystery is?
A Game
B Problem
C I don't know
D Nothing

Выход:

(
  4,
  [
    "A mystery is?",
    "A Game",
    "B Problem",
    "C I don't know",
    "D Nothing",
  ],
  1,
  ["How is the weather in India?", "A Good", "B Bad", "C Terrible"],
  3,
  [
    "Which is a fruit?",
    "A Africa",
    "B China",
    "C India",
    "D Asia ",
    "E America",
    "F Apple",
    "G Mexico",
  ],
  2,
  ["Are you hungry right this second?", "True", "False"],
)
0 голосов
/ 11 октября 2011

Я нашел способ убрать все вопросы и поместить их в хеш.Теперь мне нужно сохранить варианты, которые соответствуют им.

Отлично, ответ такой: строки, следующие за вопросами, являются ответами, поэтому, как только вы найдете вопрос, просто продолжайте добавлять строки, которые видитедо тех пор, пока вы не наберете 1) новый вопрос или 2) пустую строку

обновление: если вы не собираетесь самостоятельно проверять ошибки, use autodie; простая версия, найдите номер вопроса, все остальноерассматриваемое содержание

use autodie;
...
my %questions;
my $questionNumber = '';
while (<FILE>){
    if( /^\s* \( (\d+) \) \s* $/x ){
        $questionNumber = $1;
        $questions{ $questionNumber } = '';
    } else {
        $questions{ $questionNumber } .= $_;
    }
}
while( my( $k, $v ) = each %questions ){
    print "($k)$v\n";
    print Dumper( $k => QuestionToHash( $v ) );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...