0

我正在使用 PerlWWW::Mechanize包来获取和处理来自某些网站的数据。通常我的行动方式如下:

  1. 获取网页

    $mech->get("$url");

  2. 将网页内容保存在一个变量中(顺便说一句,我不确定将这么多文本保存在一个标量中是否是正确的方法,据我所知,它应该用于单个值)

    my $list = $mech->content();

  3. 使用我创建的子例程将变量的内容写入文本文件。(writetoFile子例程包括更多功能,例如路径和现有文件验证..)

    writeToFile("$filename.tmp","$path",$list);

  4. 通过创建一个附加文件来处理在上一步中创建的文件中的文本并将处理后的内容保存在那里(然后删除初始临时文件)。

我想知道的是,是否可以在将文本存储到文件之前直接在$list变量中执行处理?整个过程按预期工作,但我不太喜欢它背后的逻辑,而且它似乎也有点低效,因为我必须多次重写同一个文件。

编辑: 只是为了提供更多关于我在处理变量内容时实际追求的信息。因此,在这种情况下,我从网站获取的数据实际上是一个由空行分隔的项目列表,第一行与我无关。所以我在处理这些数据时做的是两件事:

  1. 删除空 (CRLF) 行
  2. 如果第一行包含特定文本,则删除它。

理想情况下,我想将处理后的列表(没有空格和第一行删除)保存在一个文件中,而不会在途中创建任何其他文件。为了保存文件,我想使用writeToFilesub (我写的),因为它还对此类文件是否已经存在进行验证(如果文件将在最终处理之前保存 -writeToFile将始终重写现有文件)。

希望这是有道理的。

4

1 回答 1

1

您正在寻找split。模式取决于:(?<=\n)在换行符处使用 split 并保留它。如果那没关系,请使用\R包含所有类型的换行符。

foreach my $line (split qr/\R/, $mech->content) {
    …
}

现在强制性的 HTML-parsing-with-regex 警告:如果您使用 Mechanize 获得 HTML 源,则逐行解析它没有多大意义。您可能想要处理text文档的 HTML 剥离版本,或者将 HTML 源代码传递给解析器,例如Web::Query,以声明方式获取您需要的部分。

于 2013-03-24T17:27:55.923 回答