【问题标题】:Processing text inside variable before writing it into file在将变量写入文件之前处理变量内的文本
【发布时间】:2013-03-24 11:06:39
【问题描述】:

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

  1. 获取网页

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

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

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

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

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

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

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

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

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

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

希望它有意义。

【问题讨论】:

  • 当然是。你到底没有管理什么?
  • @Mat 嗨。我的问题似乎是逐行读取变量内的文本并根据某些条件执行处理每一行文本,然后将输出保存在某处..就像我用文件做的一样。使用 I 文件读取每一行,检查每一行并将处理后的输出写入另一个文件。谢谢。
  • 这个问题缺少你想要通过逐行解析来完成的细节。我闻到了 XY 问题。
  • @daxim 我在我的问题中添加了一些细节。希望它能让我的问题更清楚。谢谢!

标签: perl variables


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回答。我能够将您的建议合并到我的代码中。但是你能解释一下这个qr/\R/ 模式吗?您已经提到\R 是换行的模式,但是qr 呢?谢谢
  • p3rl.org/rebackslash#%5cR p3rl.org/qr p3rl.org/op#qr%2fSTRING%2fmsixpodual qr 运算符创建一个模式。 split 的第一个参数是一个模式。
  • 非常感谢您的链接和解释!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-29
  • 2018-01-01
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 2014-10-02
相关资源
最近更新 更多