我正在使用Perl WWW::Mechanize
包来从某些网站获取和处理数据。通常我的行动方式如下:
获取网页
$mech->get("$url");
将网页内容保存在一个变量中(顺便说一句,我不确定这是否是在标量中保存这些文本的正确方法,据我所知,它应该用于单个标量值)
my $list = $mech->content();
使用我创建的子程序将变量的内容写入文本文件。 (writetoFile
子例程包含更多功能,如路径和现有文件验证。)
writeToFile("$filename.tmp","$path",$list);
通过创建附加文件处理上一步创建的文件中的文本并将处理后的内容保存在那里(然后删除初始临时文件)。
我想知道的是,是否可以在将文本存储到文件中之前直接在$list
变量中执行处理?整个过程按预期工作,但我不太喜欢它背后的逻辑,它似乎也有点低效,因为我必须多次重写同一个文件。
修改 只是为了提供一些关于我在处理变量内容时实际执行的操作的信息。因此,在这种情况下我从网站获取的数据实际上是一个由空行分隔的项目列表,第一行与我无关。所以我在处理这些数据时所做的就是两件事:
理想情况下,我希望将已处理的列表(没有空格和第一行已删除)保存在文件中,而不会在途中创建任何其他文件。为了保存文件,我想使用writeToFile
sub(我写过),因为它还会对这样的文件是否已经存在进行验证(如果文件将在最终处理之前保存 - writeToFile
将始终重写现有文件)。
希望它有意义。
答案 0 :(得分:1)
您正在寻找split。模式取决于:使用(?<=\n)
拆分新行字符并保留它。如果这无关紧要,请使用\R
包含所有类型的换行符。
foreach my $line (split qr/\R/, $mech->content) {
…
}
现在强制性的HTML-parsing-with-regex警告:如果你使用Mechanize获得HTML源代码,那么逐行解析它并没有多大意义。您可能希望处理HTML文档的text
版本,或者将HTML源代码传递给解析器(例如Web::Query)以声明性地获取所需的文件。