1

私が書くとき

#!/usr/bin/perl -w
use strict;

while( <DATA> ) {
    print "\n-------------------------\n\n";
    print;
    <>;
}

「戻る」たびに、1行取得します。

1 つの段落を「返す」たびに次のスクリプトを取得しないのはなぜですか?

#!/usr/bin/perl -w
use strict;

local $/ = "";

while( <DATA> ) {
    print "\n-------------------------\n\n";
    print;
    <>;
}

__DATA__
line one
line two
line three
line four
line five

line six
line seven
line eigth
line nine

line ten
line eleven
line twelve
4

3 に答える 3

5

$/ 変数をデフォルトの "\n" に設定した最初のスクリプトでは、<DATA> は一度に 1 行しか返しません。

2番目のスクリプトはあなたが望むことをすると思います.それは <> が「リターン」で読み取りを終了するのではなく、 $/ 設定のために <ctrl-d> で終了するだけです(他の誰かが指摘したように <> 読み取りSTDINからですが、あなたはすでにそれを知っていて、それを使用して出力を調整していると思います)。

本当に「return」で出力を調整したい場合は、ループ内で $/ をさらに使用する必要があります。

while( <データ> ) {
    print "\n-------------------------\n\n";
    印刷;
    $/ = "\n"; # デフォルトで、以下は 'return' で読み取りを終了します
    <>;
    $/ = "";
}   
于 2009-11-27T16:34:25.403 に答える
3

私はあなたがこの行を期待していると思います

local $/ = "";

の振る舞いを変える

<DATA>

データの最後まで読み続けます。

しかし、実際にはこのようなものが必要です

{
    local $/;  # $/ becomes undef in this block
    ...
}

スラープモードを有効にする(そしてそのモードを {curlys} 内のスコープに含める)。

事実上、「改行をレコードの終わりのマーカーとして考えるのを忘れる」と言っているのです。

それに加えて...あなたのコードにはタイファイターがあります!

while( <DATA> ) {
    print "\n-------------------------\n\n";
    print;
    <>;    # <-- Feel the power of the DARK SIDE!!!
}

この小さな男は、DATA からではなく、STDIN から読み取ります。それが本当に必要ですか?

于 2009-11-27T16:02:06.547 に答える
2

段落モードで <> をそのように (インタラクティブに) 使用すると、混乱を招きます。「戻る」を押しても戻りません。代わりに、空でない行 (段落の開始) になるまで読み取り、次に空行 (その段落の終わり) になるまで読み取り、次に空でない行 (段落の開始) になるまで読み取りを続けます。次の段落の - これはバッファリングされますが、返されません)、余分な空の行が破棄されたことを認識します。

おそらく、次を使用する必要があります。

local $/ = "\n"; <>

代わりにループの最後に。あるいは POSIX::getchar() かもしれません。

于 2009-11-27T19:32:59.177 に答える