1

这是一个奇怪的问题,至少对我来说是这样,因为我不完全理解这其中的全部内容。基本上,我一直在执行此过程,将抓取的文档(例如网页)保存到.txt文件中。然后我可以很容易地使用 Perl 来读取这个文件并将每一行放入一个数组中。但是,它不是根据文档中的任何可见内容来执行此操作的(即,它不是通过 HTML 换行符进行的);它只是根据.txt格式知道新行在哪里。

但是,我想删掉这个过程,只在一个变量中做同样的事情,所以我会把.txt文件的内容放在一个字符串中,然后我想以同样的方式解析它, 逐行。对我来说,问题是我不太了解它是如何工作的,因为我真的不明白 Perl 如何能够判断新行在哪里(假设我不经常使用 HTML 换行符)只是一个基于网络的 .txt 文件(它作为网页呈现给我的刮板 www:mechanize)我正在刮,所以没有 HTML 可供使用)。我想我可以使用其他参数(例如空格)来执行此操作,但我很想知道是否有办法逐行执行此操作。任何信息表示赞赏。

我想减少文件的实际保存,以减少与我使用的服务器上的权限相关的问题,并且我也很好奇我是否可以让这个过程更有效率。

4

3 回答 3

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>;
于 2010-07-17T18:13:38.953 回答
0

很难说出您的代码在做什么,因为我们面前没有它;如果您发布您所拥有的内容,会更容易提供帮助。不过,我会试一试。如果将文本抓取到变量中,您将得到一个可能嵌入换行符的字符串。这些将是\n(传统的 Unix 换行符)或\r\n(传统的 Windows 换行符序列)。就像您可以在空格上拆分以获取(第一个近似值)句子中的单词一样,您也可以在换行符序列上拆分以获取行。因此,您需要的单行应该是

my @lines = split(/\r?\n/, $scraped_text);
于 2010-07-17T12:17:20.600 回答
0

使用$/变量,这决定了在什么上换行。所以:

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

会给你用空格分隔的块。只需将其设置为恢复到"\n"原来的方式 - 或者更好的是,走出local $/范围并让全局范围返回,以防万一它不是"\n"一开始的。

您可以完全消除它:

local $/ = undef;

一口气读完整个文件。然后随心所欲地遍历它们。请注意,如果您执行 asplit或 a splice,您最终可能会一遍又一遍地复制字符串,使用大量 CPU 和大量内存。少花钱的一种方法是:

# perl -de 0
> $_="foo\nbar\nbaz\n";
> while( /\G([^\n]*)\n/go ) { print "line='$1'\n"; }
line='foo'
line='bar'
line='baz'

例如,如果您要通过换行符拆分事物。在带有-tagged 的​​正则表达式\G中匹配字符串的开头或最后一个匹配的结尾。/g

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

# 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='
'

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

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

$data = "eurgpuwergpiuewrngpieuwngipuenrgpiunergpiunerpigun";
open STRING, "<", \$data;
while(<STRING>){ print "chunk='$_'\n"; }

我认为你可以得到你需要的每一种组合......

于 2010-07-17T16:17:35.947 回答