2

我想从从数据库中检索到的文本变量中提取段落。

为了从文件处理程序中提取 pargaphs,我使用以下代码:

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

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

4

3 回答 3

8

您快到了。设置$/undef将一口气读入整个文本。

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

$/

输入记录分隔符,默认为换行符。这影响了 Perl 关于“线”的概念。像 awk 的 RS 变量一样工作,包括将空行视为终止符(如果设置为空字符串)(空行不能包含任何空格或制表符)。您可以将其设置为多字符字符串以匹配多字符终止符,或设置为 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
于 2012-09-24T09:25:42.937 回答
2

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

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

来自man perlrun

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

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

特殊值 00 将导致 Perl 以段落模式 slurp 文件。

于 2016-04-03T16:59:42.223 回答
-1

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

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

或者:

$text = 'Paragraph 1
Paragraph2';

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

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

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

于 2012-09-24T09:11:11.433 回答