簡體   English   中英

如何使用Perl一次閱讀段落?

[英]How do I read paragraphs at a time with Perl?

當我寫

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

在第一個腳本中,將$ /變量設置為默認“ \\ n”,<DATA>一次將僅返回一行。

我相信第二個腳本可以滿足您的要求,只是<>不會在'return'上終止讀取,而是在<ctrl-d>上由於您的$ /設置終止讀取(正如其他人指出的,<>讀取來自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
    ...
}

啟用Slurp模式 (並將該模式​​包含在{curlys}內部的范圍內)。

實際上,這是在說“忘記將換行符視為記錄結束標記”,

除此之外,您的代碼中還有一個戰斗機

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

這個小家伙會從STDIN而不是從DATA讀取-這真的是您想要的嗎?

在段落模式下以交互方式使用<>會造成混亂。 當您點擊“ return”時,它不會返回; 相反,它將讀取直到獲得一個非空行(段落的開頭),然后讀取直到獲得一個空行(該段落的結尾),然后繼續讀取直到獲得一個非空行(該段落的開頭)下一段的內容-將被緩沖,不返回),因此它知道它已丟棄任何多余的空行。

也許您應該使用:

local $/ = "\n"; <>

在循環的末尾。 或者也許是POSIX :: getchar()。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM