我想从从数据库中检索到的文本变量中提取段落。
为了从文件处理程序中提取 pargaphs,我使用以下代码:
local $/ = undef;
@paragarphs =<STDIN>
使用 perl 从文本变量中提取段落的最佳选择是什么,以及 cpan 上是否有执行此类任务的模块?
我想从从数据库中检索到的文本变量中提取段落。
为了从文件处理程序中提取 pargaphs,我使用以下代码:
local $/ = undef;
@paragarphs =<STDIN>
使用 perl 从文本变量中提取段落的最佳选择是什么,以及 cpan 上是否有执行此类任务的模块?
您快到了。设置$/
为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
您已经有了脚本 ( local $/ = "";
) 的答案,但值得注意的是,单行语句有一个快捷方式:-00
选项。
perl -00 -ne '$count++; END {print "Counted $count paragraphs\n"}' somefile.txt
来自man perlrun
:
-0[八进制/十六进制]
指定输入记录分隔符 ($/) [...]
特殊值 00 将导致 Perl 以段落模式 slurp 文件。
如果文本在变量中,例如:
$text = "Here is a paragraph.\nHere is another paragraph.";
或者:
$text = 'Paragraph 1
Paragraph2';
您可以通过用“\n”分割文本来简单地获取段落。
@paragraphs = split("\n",$text);
如果您的段落由双换行符或 \n 和 \r 的组合分隔(如在 Windows 中),您可以相应地更改拆分命令。