【问题标题】:Perl splitting text string (from HTML page, text document, etc.) by line into array?Perl将文本字符串(来自HTML页面,文本文档等)逐行拆分为数组?
【发布时间】:2010-07-17 12:03:50
【问题描述】:

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

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

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

【问题讨论】:

    标签: regex perl text-parsing


    【解决方案1】:

    这是一个可能对您有所帮助的想法:您可以从 strings 以及文件中 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>;
    

    【讨论】:

    • 谢谢,这正是我要找的东西。我会试试的
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      使用$/ 变量,这决定了换行符。所以:

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

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

      你可以完全消除它:

      local $/ = undef;
      

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

      # 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),你可以获得记录长度的块:

      # 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"; }
      

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

      【讨论】:

      • 感谢您的帖子.. 但是问题是我不是从文件中读取,它是从字符串变量中获取的,我想完全避免使用文件
      • @rick:第一部分和最后一部分都是关于字符串的:关于\G 的部分和关于处理open 的标量引用的部分。不需要文件。希望对您有所帮助。
      猜你喜欢
      • 1970-01-01
      • 2017-02-02
      • 1970-01-01
      • 1970-01-01
      • 2012-12-30
      • 1970-01-01
      • 2012-04-21
      • 2019-06-15
      • 1970-01-01
      相关资源
      最近更新 更多