2013-03-24 80 views
0

我使用Perl WWW::Mechanize包来从一些网站获取和处理数据。通常我的行动方式如下:在写入文件之前处理变量中的文本

  1. 取网页

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

  2. 保存在一个变量(BTW的,我不知道这是否是正确的方式对网页内容保存标中的文本的这个量的,据我所知,应该是用于单个值)

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

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

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

  4. 通过建立一个附加文件的处理在先前步骤中创建的文件的文本和保存处理的内容有(然后删除最初的临时文件)。

我想知道什么,是是否有可能存储在文件中的文本之前执行的处理,直接在$list变量里面?整个过程如预期的那样工作,但是我并不喜欢它背后的逻辑,而且它也有点低效,因为我必须多次重写相同的文件。

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

  1. 取出空(CRLF)行
  2. 删除第一行,如果它包括一个特定的文本。

理想情况下,我希望将已处理的列表(未删除空格和第一行)保存在文件中,而不会在途中创建任何其他文件。为了保存文件,我想用writeToFile子(我写),因为它也对这样的文件是否已经存在执行验证(如果一个文件将在最终处理前被保存 - 在writeToFile总是会改写现有的文件)。

,真希望是有道理的。

+0

当然是。你究竟在管理什么? – Mat 2013-03-24 11:10:08

+0

@Mat嗨。我的问题似乎是逐行读取可变内部的文本,并根据某些条件执行处理每行文本,然后将输出保存在某处..就像我用文件做的那样。用I文件,我读取每一行,检查每一行,并将处理后的输出写入另一个文件。谢谢。 – 2013-03-24 11:16:23

+1

看看这里的答案:http://stackoverflow.com/questions/1445426/how-can-i-process-a-multi-line-string-one-line-at-a-time-in-perl-with -use-strict,特别是http://stackoverflow.com/a/1445732/635608 – Mat 2013-03-24 11:19:43

回答

1

您正在寻找split。该模式取决于:使用(?<=\n)拆分为新的一行字符并保留它。如果没关系,请使用\R来包含各种换行符。

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

现在强制性的HTML的解析,用正则表达式警告:如果你的HTML源与机械化,解析它行由行并没有太大的意义。您可能想要处理HTML文档的text版本,或者将HTML源代码传递给解析器(例如Web::Query)以声明式地获取所需的部分。

+0

谢谢你的回答。我能够将您的建议并入我的代码。但是,请你解释一下这个'qr/\ R /'模式。你提到'\ R'是换行的模式,但是'qr'怎么办?谢谢 – 2013-03-28 16:26:57

+1

http://p3rl.org/rebackslash#%5cR http://p3rl.org/qr http://p3rl.org/op#qr%2fSTRING%2fmsixpodual'qr'运算符生成一个模式。 “split”的第一个参数是一个模式。 – daxim 2013-03-28 20:12:00

+0

非常感谢您的链接和解释! – 2013-03-28 20:13:25

相关问题