这是一个奇怪的问题,至少对我而言,因为我并不完全理解完全参与其中的内容。基本上,我一直在做这个过程,我将一个已删除的文档(如网页)保存到.txt
文件。然后我可以轻松地使用Perl读取此文件并将每行放入一个数组中。但是,它不是基于文档中的任何可见事物(即,它不是通过HTML换行符)来执行此操作;它只根据.txt
格式知道新行的位置。
但是,我想把这个过程切掉,只是在一个变量中做同样的事情,所以相反我会得到一个字符串中.txt
文件的内容然后我想要的以同样的方式逐行解析它。对我来说问题是我不太了解这是如何工作的,因为我不太了解Perl如何能够告诉新线路的位置(假设我没有通过HTML换行符,因为它经常是只是一个基于Web的.txt文件(它呈现给我的刮刀,www:mechanize,作为一个网页)我正在抓取所以没有HTML可用。)我想我可以使用其他参数来做到这一点,比如空格,但我很想知道是否有办法按行完成。任何信息都表示赞赏。
我想减少文件的实际保存,以减少与我使用的服务器上的权限相关的问题,而且如果我可以提高流程的效率,我也很好奇。
答案 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='
'
我认为你可以得到你需要的所有组合......