Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

Re: How can you sysread an entire file?

by ChemBoy (Priest)
on Jan 13, 2006 at 00:59 UTC ( #522852=note: print w/ replies, xml ) Need Help??


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


Comment on Re: How can you sysread an entire file?
Select or Download Code
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!

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://522852]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others avoiding work at the Monastery: (4)
As of 2015-07-04 11:27 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (59 votes), past polls