What if your data contains an empty line? At that point, index $block, "\n" will at one time return 0. From there on, the loop's condition will always return 0, $left will grow until the end of the file, and the data will not ever be pushed onto the array @lines.my $i = index $block, "\n"; while($i > 0){ push @lines, substr($block,0,$i); substr($block,0,$i+1,''); $i = index $block, "\n"; }
What if the file data doesn't end with "\n"? Again: the last line is disregarded. At least, push the contents of $left onto the array, if it has a length > 0.
The next code will behave better on both regards, though I haven't benchmarked it, but it could be that your suspiciously excellent results are indeed partly caused by the presence of an empty line.
my $block; local $_ = ''; my $i; while(my $n = read $fh, $block, 8192 ) { $_ .= $block; while((my $i = index $_, "\n") >= 0){ push @lines, substr($_, 0, $i); substr($_, 0, $i+1, ''); } } push @lines, $_ if length;
In reply to Re: Why use <$fh> at all? (bug fix)
by bart
in thread Why use <$fh> at all?
by cluka
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |