2012-09-24 198 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文件。