我想从从数据库中检索到的文本变量中提取段落。从文本中提取段落perl
用于提取文件处理我用下面的代码的pargaphs:
local $/ = undef;
@paragarphs =<STDIN>
什么是用perl从文本变数中撷取几段的最佳选择,如果有模块上做这种类型的CPAN任务?
我想从从数据库中检索到的文本变量中提取段落。从文本中提取段落perl
用于提取文件处理我用下面的代码的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
如果文字是一个变量,例如:
$text = "Here is a paragraph.\nHere is another paragraph.";
或:
$text = 'Paragraph 1
Paragraph2';
你可以简单地通过拆分为 “\ n” 的文本获得的段落。
@paragraphs = split("\n",$text);
如果你的段落是由双换行符或(如在Windows中)\ n和\ r的组合来分隔,你可以相应地改变分割命令。
OP的原始代码已经是这样了(当不设置'$ /'时),并且不需要将整个文件读入内存来执行。 –
你已经拥有的回答一个脚本(local $/ = "";
),但值得注意的是,有一行代码有一个快捷方式:th e -00
选项。
perl -00 -ne '$count++; END {print "Counted $count paragraphs\n"}' somefile.txt
从man perlrun
:
-0八进制/十六进制]
指定输入记录分隔符($ /)[...]
特殊值00将导致Perl在第 模式下sl files文件。
您已更改您的代码以反映我的答案。这会让读者阅读这篇文章的人感到困惑。请回滚。 – Zaid
是的,我改变了它,但我的意思是有本地$/=“” – smith
设置$ /无论你调用段落分隔符 – PSIAlt