Perl将文本字符串(从HTML页面,文本文档等)拆分为数组?

时间:2010-07-17 12:03:50

标签: regex perl text-parsing

这是一个奇怪的问题,至少对我而言,因为我并不完全理解完全参与其中的内容。基本上,我一直在做这个过程,我将一个已删除的文档(如网页)保存到.txt文件。然后我可以轻松地使用Perl读取此文件并将每行放入一个数组中。但是,它不是基于文档中的任何可见事物(即,它不是通过HTML换行符)来执行此操作;它只根据.txt格式知道新行的位置。

但是,我想把这个过程切掉,只是在一个变量中做同样的事情,所以相反我会得到一个字符串中.txt文件的内容然后我想要的以同样的方式逐行解析它。对我来说问题是我不太了解这是如何工作的,因为我不太了解Perl如何能够告诉新线路的位置(假设我没有通过HTML换行符,因为它经常是只是一个基于Web的.txt文件(它呈现给我的刮刀,www:mechanize,作为一个网页)我正在抓取所以没有HTML可用。)我想我可以使用其他参数来做到这一点,比如空格,但我很想知道是否有办法按行完成。任何信息都表示赞赏。

我想减少文件的实际保存,以减少与我使用的服务器上的权限相关的问题,而且如果我可以提高流程的效率,我也很好奇。

3 个答案:

答案 0 :(得分:2)

以下是一个可能对您有所帮助的想法:您可以从字符串以及文件中open

所以如果你曾经这样做过:

open( my $io, '<', 'blah.txt' ) or die "Could not open blah.txt! - $!";
my @list = <$io>;

你可以这样做:

open( my $io, '<', \$text_I_captured ); 
my @list = <$io>;

答案 1 :(得分:0)

很难说出你的代码在做什么,因为我们没有把它放在我们面前;如果你张贴了你的东西,它会更容易帮助。但是,我会试一试。如果将文本刮入变量,则会有一个可能包含嵌入换行符的字符串。这些将是\n(传统的Unix换行符)或\r\n(传统的Windows换行符序列)。就像你可以在空格上分割得到句子中的单词(第一个近似值)一样,您可以在换行符序列上拆分以获取行。因此,您需要的单行应该是

my @lines = split(/\r?\n/, $scraped_text);

答案 2 :(得分:0)

使用$/变量,这决定了断行的内容。所以:

local $/ = " ";
while(<FILE>)...

会给你用空格分隔的块。只需将其设置回"\n"即可恢复原来的状态 - 或者更好的是,退出local $/范围并让全局范围内的用户回来,以防它不是{ {1}}开头。

你可以完全消除它:

"\n"

一次读取整个文件。然后按照你喜欢的方式迭代它们。请注意,如果您执行local $/ = undef; split,您可能会使用大量CPU和大量内存来反复复制字符串。少用它的一种方法是:

splice

例如,如果你用新行拆分东西。 # perl -de 0 > $_="foo\nbar\nbaz\n"; > while( /\G([^\n]*)\n/go ) { print "line='$1'\n"; } line='foo' line='bar' line='baz' 匹配字符串的开头或最后一个匹配的结尾,位于\G - 标记的正则表达式中。

另一个奇怪的小问题是/g ...如果你给它一个整数的标量引用(这里是$/=\10),你可以获得记录长度的块:

10

更多信息:http://www.perl.com/pub/a/2004/06/18/variables.html

如果您将此与FM的使用答案相结合:

# cat fff
eurgpuwergpiuewrngpieuwngipuenrgpiunergpiunerpigun
# perl -de 0
$/ = \10;
open FILE, "<fff";
while(<FILE>){ print "chunk='$_'\n"; }
chunk='eurgpuwerg'
chunk='piuewrngpi'
chunk='euwngipuen'
chunk='rgpiunergp'
chunk='iunerpigun'
chunk='
'

我认为你可以得到你需要的所有组合......