【问题标题】:perl code to read external file to a certain point, then read from that point onperl 代码将外部文件读取到某个点,然后从该点开始读取
【发布时间】:2020-09-01 20:59:10
【问题描述】:

我正在尝试从 Perl 脚本打开一个文件并搜索“Quiz 2”(文本文件大约有 65 行)。然后,从那一点直到找到“============”(在每个“测验”的末尾),只推动这两点之间的线放入一个数组,然后在数组中搜索每个问题末尾的“----”,并将每个问题一次打印到屏幕上。

这就是计划,让我夜不能寐(课程标准):-)

任何帮助都会很棒....

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";
  }
}

第一个 foreach 工作正常,第二个没有,第三个在数组中没有要打印的内容
谢谢,
尼克..

【问题讨论】:

  • 您是否考虑过使用拆分 foreach 测验并再次使用 foreach 问题?
  • 感谢 BalooRM 的回归 - 是的,我首先在 while 循环中尝试了一个 foreach,然后尝试将它们都设为 foreach 循环
  • 您能否阅读整个文件,将文件拆分为单独的测验,遍历每个测验,并将每个测验拆分为多个问题?
  • 好吧,你有没有尝试过——我们能看到代码吗?什么不工作?
  • 一种方式:逐行阅读,在匹配 /(Quiz\s+[0-9]+)/ 时设置一个标志,为带有 =s 的行取消设置。如果标志打开,则向字符串添加一行。在清除标志时将字符串添加到数组中。

标签: perl foreach while-loop cgi do-while


【解决方案1】:

或许代码如下:

将文件读入变量

(Quiz \d+.*?)============ 拆分为数组@quizes

循环@quizes提取带有(Question #\d+)(.*?)---- 的问题到哈希中

将结果推入由$quizes 变量引用的哈希中

此时您可以通过索引访问任何测验和测验的任何问题

注意:OP没有提供测试数据,代码是即兴创作的,Lorem Ipsum生成器用于填充问题的内容

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.
----
============

输出

$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.
'
                        }
                      ]
        };

【讨论】:

  • 谢谢 PB - 我会看看你的代码。我只需要读出这个文件,不需要答案,因为这是从单独的脚本中完成的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-09
  • 1970-01-01
  • 2015-12-08
  • 1970-01-01
相关资源
最近更新 更多