I recommend the idiom $_ .= <>. For example, in this case this would be something like:
use warnings; use strict;
while (<DATA>) {
while (!/(?:[^;]*+;){2}/) {
$_ .= <DATA>;
}
print "read one record: \n(($_))\n";
}
__DATA__
The Road Ahead1;Completely Revised and
Up-to-Date; 002564418
road ahead2; Americaa creeping revolution;00345678
The road ahead3;[Address made before the Regional
Foreign Policy Conference; 004561963
You may need to modify the regular expression to whatever it is that you recognize a full record.
If the continuation lines are marked by the whitespace at the beginning of the next line (like in mail headers) not somehoe in the incomplete line (like in smtp commands), then you can't use this simple idiom. In this case, I recommend a one-line buffer, e.g.
use warnings; use strict;
my($buf, $bufq);
sub peekline {
$bufq or $buf = <DATA>;
$bufq = 1;
$buf;
}
sub getline {
$bufq or $buf = <DATA>;
$bufq = ();
$buf;
}
while (defined($_ = getline)) {
while (defined(peekline) and peekline =~ /^\s/) {
$_ .= getline;
}
print "read one record: \n(($_))\n";
}
|