The chomp function removes the current 'input record separator' (stored in $/, see perlvar) from the end of a given string of text. You have two options to make it behave in the given circumstance. I will assume, from here, that you are reading lines from a file with Windows-style line-endings (\r\n).
First, you could simply adjust your $/:
local $/ = "\r\n";
while (<DATA>) {
chomp $_;
print STDERR "'$_'\n";
}
Of course, if you don't know what kind of line endings you have, you can simply convert all line endings to newlines first:
while (<DATA>) {
s/\r[\n]*/\n/gm; # now, an \r (Mac) or \r\n (Win) becomes \n (UNIX
+)
chomp $_;
print STDERR "'$_'\n";
}
Seems a waste to run a regex and chomp, but you could remove chomp from the code above, and replace the regex with:
s/\r[\n]*//gm;
Of course, if your input separator isn't set, you'll read the whole file on the first pass through the while loop. You might consider an alternate strategy:
open FH, '<', $file or die "Can't read '$file': $!";
# find out what kind of line endings we have
my $buffer;
local $/ = undef;
while ( read( FH, $buffer, 1024 ) ) {
if ( $buffer=~m/(\r[\n]*)/s ) {
$/ = $1; # set the input separator to what we found
last; # stop trying to find the separator
}
}
close FH;
# now reopen the FH and read line by line
open FH, '<', $file or die "Can't read '$file': $!";
while (<FH>) {
chomp;
print STDERR "'$_'\n";
}
close FH;
There are cases I haven't dealt with, etc. for purposes of simplicity.
|