Note, that when I just loop through the lines without doing the RE the disk and in-memory files take about the same amount of time, so it seems it is the RE that is causing the problem.
That suggests to me that the data seen in the first and second loops are not the same. If you put a counter in the loops, do they both see the same number of lines?
In particular if you are running this on Windows, I believe it may do some automatic conversion of CRLF line endings on read, in which case building up $s in this way may result in something that would read the whole in-memory file as a single line.
You might try the following approach to set up the in-memory file, which would be more efficient and may be more certain to give the same content:
seek $fh, 0, 0; my $s = do { local $/; <$fh>; };
This reads the full content of the file in one go, rather than reading it line by line and then appending. (See also what's faster than .= for more detail on why building up a string piecewise can be really inefficient.)
In reply to Re: RE on lines read from in-memory scalar is very slow
by hv
in thread RE on lines read from in-memory scalar is very slow
by Danny
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |