Frage

Wenn ich schreibe

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

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

Nach jeder "Rückkehr" bekomme ich eine Zeile.

Warum bekomme ich nicht mit dem nächsten Skript nach jedem "Rückkehr" einen Absatz?

#!/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
War es hilfreich?

Lösung

In Ihrem ersten Skript, mit dem auf Standard " n" festgelegten $/ Variablen, die, dieu003CDATA> Wird jeweils nur eine Zeile zurückgeben.

Ich glaubeu003Cctrl-d> Aufgrund Ihrer $/ Einstellung (wie jemand anderes auf <> von stdin hervorgeht, wissen Sie das bereits und verwenden sie, um die Ausgabe zu regulieren).

Wenn Sie die Ausgabe mit 'Rückgabe' wirklich regulieren möchten, müssen Sie mehr mit $/ in der Schleife tun.

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

Andere Tipps

Ich denke, Sie erwarten diese Linie

local $/ = "";

das Verhalten von zu ändern

<DATA>

bis zum Ende der Daten weiter lesen.

Aber in der Tat braucht es so etwas

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

ermöglichen Slurp -Modus (und um diesen Modus zum Zielfernrohr in den {Curlys} zu enthalten).

In der Tat heißt es: "Vergessen Sie, dass Newlines als Marker des Rekords denken".

Außerdem ... gibt es eine Kämpfer in Ihrem Code!

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

Dieser kleine Kerl wird von Stdin lesen, nicht aus Daten - ist das wirklich das, was Sie wollen?

Die Verwendung von <> auf diese Weise (interaktiv) im Absatzmodus wird verwirrend sein. Es wird nicht zurückkehren, wenn Sie "Rückkehr" treffen. Stattdessen wird es gelesen, bis es eine nicht leere Linie (den Beginn eines Absatzes) erhält, und dann zu lesen, bis sie eine leere Linie (das Ende dieses Absatzes) erhält, und dann des folgenden Absatzes - der gepuffert und nicht zurückgegeben wird), so dass es zusätzliche leere Linien verworfen hat.

Vielleicht sollten Sie verwenden:

local $/ = "\n"; <>

Am Ende Ihrer Schleife stattdessen. Oder vielleicht posix :: getchar ().

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top