1

当我写

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

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

每次“返回”后,我都会得到一行。

为什么在每个“返回”一个段落之后我不使用下一个脚本?

#!/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> 一次只会返回一行。

我相信第二个脚本可以满足您的要求,只是由于您的 $/ 设置, <> 不会在“返回”上终止读取,而是在 <ctrl-d> 上终止读取(正如其他人指出的那样 <> 读取来自 STDIN,但我认为您已经知道并正在使用它来调节输出)。

如果你真的想用'return'来调节输出,那么你需要在循环中用 $/ 做更多的事情。

而(<数据>){
    打印 "\n--------------\n\n";
    打印;
    $/ = "\n"; # 默认,以便以下内容在“返回”时终止读取
    <>;
    $/ = "";
}   
于 2009-11-27T16:34:25.403 回答
3

我猜你期待这条线

local $/ = "";

改变行为

<DATA>

继续阅读直到数据结束。

但实际上它需要这样的东西

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

启用slurp 模式(并将该模式​​包含在 {curlys} 内的范围内)。

实际上它是在说“忘记将换行符视为记录结束标记”,

除此之外......你的代码中有一个平手

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

这个小家伙会从 STDIN 读取,而不是从 DATA 读取 - 这真的是您想要的吗?

于 2009-11-27T16:02:06.547 回答
2

在段落模式中以这种方式(交互地)使用 <> 会令人困惑。当你点击“return”时它不会返回;相反,它将读取直到它得到一个非空行(段落的开头),然后读取直到它得到一个空行(该段落的结尾),然后继续阅读直到它得到一个非空行(开始以下段落的 - 将被缓冲,而不是返回),因此它知道它已丢弃任何额外的空行。

也许你应该使用:

local $/ = "\n"; <>

而是在循环结束时。或者可能是 POSIX::getchar()。

于 2009-11-27T19:32:59.177 回答