http://qs321.pair.com?node_id=522852


in reply to How can you sysread an entire file?

If you really want to put it all in an array at once, use this: @array = split /(?<=\r)/, $rec; If you don't have a compelling need to do that, though, then I would recommend processing it line by line:

while ($rec =~ /([^\r]+\r?)/g) { frobulate($1); }

Both of the above assume that you mean a carriage return, not a newline, when you say carriage return (and that you're not running this on a machine running Mac OS 9 or lower).



If God had meant us to fly, he would *never* have given us the railroads.
    --Michael Flanders

Replies are listed 'Best First'.
Re^2: How can you sysread an entire file?
by NeilF (Sexton) on Jan 13, 2006 at 23:15 UTC
    Why do you recommend the second solution out of interest?

    I mean line ends in "\n";

    Sorry, but what on earth is "frobulate($1)"? I've never seen that before!?

      I would recommend it because it's the least memory-intensive approach, and you're potentially using a lot of memory already. (Best would of course be to read the file line-by-line, but since you can't do that, this is the next best thing I could come up with.)

      As to the other, you didn't stipulate what you wanted to do with the records when you had them split, and I needed a dummy subroutine to show the outline right (and to note that your data is found in $1). Blame the chatterbox for the odd word choice. :-)



      If God had meant us to fly, he would *never* have given us the railroads.
          --Michael Flanders

        OK :)

        Here's an example...

        my $rec; sysopen(DF,"test.txt", O_RDONLY | O_CREAT); sysread(DF, $rec, -s DF); close DF; # Split up records into array. # Will lose \n on recs - add later. @test=split("\n",$rec); # Do some work on @test Work... Work... Work... # Build up into a single record, putting \n back in my $rec;foreach(@test){$rec.=$_."\n";} sysopen(DF,"test.txt", O_WRONLY | O_CREAT); syswrite DF,$rec; close DF;
        Does that help set the scene a little better? :)

        So basically I want to make this as efficient as possible. I have to use SYSREAD and SYSWRITE to make the IO as optimal as possible. ie: Reading a 1 meg file would take 2000 IO processes if buffered!!!!! SYSREAD will in effect take 1!