用perl从文本中提取段落

时间:2012-09-24 09:02:43

标签: perl

我想从从DB中检索的文本变量中提取段落。

从文件处理程序中提取pargaphs我使用下面的代码:

local $/ = undef;
@paragarphs =<STDIN> 

使用perl从文本变量中提取段落的最佳选择是什么?如果cpan上有模块执行此类任务?

3 个答案:

答案 0 :(得分:8)

你快到了。将$/设置为undef将一次性覆盖整个文本。

根据perldoc perlvar(强调我自己),您想要local $/ = "";启用段落模式:

  

<强> $ /

     

输入记录分隔符,默认为换行符。这影响了Perl的   什么是“线”的想法。像awk的RS变量一样工作,包括   如果设置为空字符串,则将空行视为终止符(an   空行不能包含任何空格或制表符)。您可以将其设置为a   用于匹配多字符终结符的多字符字符串,或者   undef来读取文件的结尾。将其设置为“\ n \ n”表示   如果文件包含,则设置为“”略有不同   连续空行。 设置为“”将处理两个或更多   连续的空行作为一个空行。设置为“\ n \ n”   会盲目地假设下一个输入字符属于下一个输入字符   段落,即使它是换行符。


当然,可以让文件句柄从字符串而不是文件中读取:

use strict;
use warnings;
use autodie;

my $text = <<TEXT;
This is a paragraph.

Here's another one that 
spans over multiple lines.

Last paragraph
TEXT

local $/ = "";
open my $fh, '<', \$text;

while ( <$fh> ) {

    print "New Paragraph: $_";
}

close $fh;

<强>输出

New Paragraph: This is a paragraph.

New Paragraph: Here's another one that
spans over multiple lines.

New Paragraph: Last paragraph

答案 1 :(得分:2)

您已经获得了脚本(local $/ = "";)的答案,但值得注意的是,单行代码有一个快捷方式:-00选项。

perl -00 -ne '$count++; END {print "Counted $count paragraphs\n"}' somefile.txt

来自man perlrun

  

-0 [八进制/十六进制]

     

指定输入记录分隔符($ /)[...]

     

特殊值00将导致Perl在段落中粘贴文件   模式。

答案 2 :(得分:-1)

如果文本在变量中,例如:

$text = "Here is a paragraph.\nHere is another paragraph.";

或:

$text = 'Paragraph 1
Paragraph2';

您可以通过将文本拆分为“\ n”来简单地获取段落。

@paragraphs = split("\n",$text);

如果您的段落由双换行符或\ n和\ r的组合分隔(如在Windows中),则可以相应地更改拆分命令。