質問
書くとき
#!/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()かもしれません。