2

DBから取得したテキスト変数から段落を抽出したいと思います。

ファイルハンドラーからpargaphを抽出するには、次のコードを使用します。

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

perlを使用してテキスト変数から段落を抽出するための最良のオプションは何ですか?また、このタイプのタスクを実行するモジュールがcpanにある場合はどうなりますか?

4

3 に答える 3

8

あなたはほとんどそこにいます。に設定$/するundefと、テキスト全体を一度に丸呑みします。

あなたが望むのはlocal $/ = "";、段落モードを有効にすることですperldoc perlvar(私自身を強調してください):

$/

入力レコード区切り文字、デフォルトでは改行。これは、「行」とは何かという Perl の考えに影響を与えます。awk の RS 変数のように機能し、空行をヌル文字列に設定するとターミネータとして扱います (空行にはスペースやタブを含めることはできません)。複数文字のターミネータに一致するように複数文字の文字列に設定するか、ファイルの最後まで読み取るために undef に設定することができます。ファイルに連続した空行が含まれている場合、 "\n\n" に設定することは、 "" に設定することとは少し異なることを意味します。"" に設定すると、2 つ以上の連続する空行が 1 つの空行として扱われます。"\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
于 2012-09-24T09:25:42.937 に答える
2

スクリプト ( ) の答えは既にlocal $/ = "";わかっていますが、ワンライナーのショートカットがあることに注意してください:-00オプションです。

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

からman perlrun:

-0[8進数/16進数]

入力レコードセパレーター ($/) を指定します [...]

特別な値 00 により、Perl は段落モードでファイルを丸呑みします。

于 2016-04-03T16:59:42.223 に答える
-1

テキストが変数に含まれている場合、次に例を示します。

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

また:

$text = 'Paragraph 1
Paragraph2';

テキストを「\n」で分割するだけで段落を取得できます。

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

段落が二重改行または\nと\rの組み合わせ(Windowsの場合のように)で区切られている場合は、それに応じて分割コマンドを変更できます。

于 2012-09-24T09:11:11.433 に答える