質問

書くとき

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

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

各<!> quot; return <!> quot;の後1行取得します。

各<!> quot; return <!> quot;の後に次のスクリプトを取得しないのはなぜですか。 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
役に立ちましたか?

解決

最初のスクリプトで、$ /変数をデフォルトの<!> quot; \ n <!> quot;に設定して、<!> lt; DATA <!> gt;一度に1行のみを返します。

2番目のスクリプトはあなたが望むことを行うと信じています、それはまさに<!> lt; <!> gt; 'return'で読み取りを終了するのではなく、<!> lt; ctrl-d <!> gt;で読み取りを終了します。あなたの$ /設定のため(他の誰かが<!> lt; <!> gt;がSTDINから読み取ったと指摘したが、あなたはすでにそれを知っており、それを使用して出力を調整していると思う)。

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

while( <DATA> ) {
    print "\n-------------------------\n\n";
    print;
    $/ = "\n"; # default so that the following terminates the read on 'return'
    <>;
    $/ = ""; 
}   

他のヒント

この行を期待していると思います

local $/ = "";

動作を変更するには

<DATA>

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

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

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

スラープモード(および{curlys}内のスコープにそのモードを含めます。)

実際には、<!> quot;改行をレコードの終わりマーカーとして考えるのを忘れてください<!> quot;、

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

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

この小さな男は、DATAからではなく、STDINから読み取ります-それは本当にあなたが望むものですか?

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

おそらく使用する必要があります:

local $/ = "\n"; <>
代わりに、ループの最後で

。または、POSIX :: getchar()かもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top