【问题标题】:How do I read paragraphs at a time with Perl?如何使用 Perl 一次阅读段落?
【发布时间】:2010-12-21 00:51:40
【问题描述】:

当我写作时

#!/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

【问题讨论】:

    标签: perl paragraph


    【解决方案1】:

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

    也许你应该使用:

    local $/ = "\n"; <>
    

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

    【讨论】:

      【解决方案2】:

      在您的第一个脚本中,将 $/ 变量设置为默认值“\n”, 一次只会返回一行。

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

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

      而(){ 打印 "\n--------------\n\n"; 打印; $/ = "\n"; # 默认,以便以下内容在“返回”时终止读取 ; $/ = ""; }

      【讨论】:

        【解决方案3】:

        我猜你期待这条线

        local $/ = "";
        

        改变行为

        <DATA>
        

        一直读到数据结束。

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

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

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

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

        除此之外......您的代码中还有一个tie fighter

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

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

        【讨论】:

        • 实际上,Perl 的“领带战斗机”就是“”,我们有时也称之为“宇宙飞船操作员”。
        • 我知道,但是 离我太近了,我在星期五傻笑的大脑无法抗拒跳过那个小细节。
        • 我认为我们将不得不发明一个 &lt;-o-&gt; 运算符。
        • @edg:我认为很明显从 STDIN 读取是故意的,但他只希望在 DATA 上使用段落模式,而不是在 STDIN 上。
        猜你喜欢
        • 2020-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多