Wie lese ich Absätze gleichzeitig mit Perl?
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
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 ().