我想从从DB中检索的文本变量中提取段落。
从文件处理程序中提取pargaphs我使用下面的代码:
local $/ = undef;
@paragarphs =<STDIN>
使用perl从文本变量中提取段落的最佳选择是什么?如果cpan上有模块执行此类任务?
答案 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中),则可以相应地更改拆分命令。