2012-09-24 200 views
1

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

用于提取文件处理我用下面的代码的pargaphs:

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

什么是用perl从文本变数中撷取几段的最佳选择,如果有模块上做这种类型的CPAN任务?

+0

您已更改您的代码以反映我的答案。这会让读者阅读这篇文章的人感到困惑。请回滚。 – Zaid

+0

是的,我改变了它,但我的意思是有本地$/=“” – smith

+0

设置$ /无论你调用段落分隔符 – PSIAlt

回答

7

你快到了。将$/设置为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 
+0

好吧,我如何从这个变量$文本中提取段落?你也是对的,但我想从文本中提取paragaphs而不是文件句柄 – smith

+0

@smith在这种情况下,写一个正则表达式,并使用'split'。这会产生类似的效果:对于严格设置,我的@paragraphs = split/\ n \ n + /,$ text',IRL我倾向于使用'/ \ s *?\ n \ s * \ n /'正规表达式将仅包含空格的行视为空行。 – amon

+0

@smith:我已经添加了一个示例,显示如何打开一个文件句柄到一个字符串...希望它可以帮助 – Zaid

-1

如果文字是一个变量,例如:

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

或:

$text = 'Paragraph 1 
Paragraph2'; 

你可以简单地通过拆分为 “\ n” 的文本获得的段落。

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

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

+0

OP的原始代码已经是这样了(当不设置'$ /'时),并且不需要将整个文件读入内存来执行。 –

2

你已经拥有的回答一个脚本(local $/ = "";),但值得注意的是,有一行代码有一个快捷方式:th e -00选项。

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

man perlrun

-0八进制/十六进制]

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

特殊值00将导致Perl在第 模式下sl files文件。