I share the opinion that it is quite unnecessary to read a 38MB disk-file into virtual memory in order to process it. In particular,
if when that file becomes, say, “10 times larger than it now is,” your current approach might begin to fail. It’s just as easy to pass a file-handle around, and to let that be “your input,” as it is to handle a beefy array. Also consider, if necessary, defining a sub (perhaps, a reference to an anonymous function ...) that can be used to filter each of the lines as they are read: the while loop simply goes to the next line when this function, say, returns False.
We know that BrowserUK, in his daily $work, deals with enormous datasets in very high-performance situations. If he says what he just did about your situation, then, frankly, I would take it as a very well-informed directive to “do it that way.” :-)