Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW
 
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

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!

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://522852]
help
Chatterbox?
[choroba]: they
[LanX]: why do you think it's more than one person?
[Your Mother]: Because we are LEGION! Fix YOUR SIG SIG BLOCK!!!!
[Your Mother]: Forgot to sign in as my sockpuppet, how embarrassing!
[1nickt]: pryrt I am creating a Type to check valid user IDs, which must be a whole number greater than or equal to zero. I would like to disallow 1.0 but because of this behaviour, by the time it is checked by the constraint, it *is* an Int.
[LanX]: should this be considered? Re: Parsing .txt into arrays
[LanX]: and this Re^4: Hash user input
[pryrt]: LanX, I would vote "keep" if it were considered: it's not helpful, but it could be taken multiple ways, not all of which are offenseive...
[pryrt]: 1nickt: if you are checking for valid user IDs, then I wouldn't care about the difference between 1.0 and 1: I would take either as a valid representation of the integer user ID#1
[LanX]: and this Re^2: extract column data

How do I use this? | Other CB clients
Other Users?
Others meditating upon the Monastery: (14)
As of 2017-05-24 20:14 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?