http://qs1969.pair.com?node_id=2878


in reply to Return the contents of a file

Two things:

1) that while loop should read:

while (<FS>) { $OP .= $_ }
Note the all-important ".=" instead of "=" (probably just a mistype on your part. :)

2) your opens should always check for error messages, and you should get faster results slurping the whole file in as one string, like so:

sub readfile { my $OP; open FS, $_[0] or die "Can't open $_[0]: $!"; { local $/ = undef; $OP = <FS>; } close FS or die "Can't close $_[0]: $!"; return $OP; }

Replies are listed 'Best First'.
RE: Return the contents of a file
by turnstep (Parson) on Apr 12, 2000 at 18:02 UTC

    Here's another version:

    sub readfile { local $/="" unless wantarray; return open(FS, shift) ? <FS> : undef; }
    No 'my' variables, handles both string and array requests, and returns undef if the file could not be opened. Use it like this:

    defined($slurp = &readfile($file)) or die "Could not open $file: $!\n" +; print "Scalar 'slurp' now has ", length $slurp, " characters in it\n"; defined(@slurp = &readfile($file)) or die "Could not open $file: $!\n" +; print "Array 'slurp' now has ", $#slurp, " elements in it.\n";
      WOW!
      Just loves to see this.
      -anders
RE: RE: Return the contents of a file
by Chris (Novice) on Apr 12, 2000 at 05:50 UTC
    I REALLY do like this one. I've found that it works great for small files. Has anyone had any experiences using this technique w/ something large like a *.cvs file from a database dump? Are there any memory issues to handling a variable that large. -- I shouldn't thinks so. Hmmm...
      There *are* memory issues in having very large variables, just as there would be, presumably, in any language. Perl variables take up a lot of space. From perlfaq3:
      When it comes to time-space tradeoffs, Perl nearly always prefers to throw memory at a problem. Scalars in Perl use more memory than strings in C, arrays take more that, and hashes use even more.
      I mean, if you *can* process a file line by line, it's best to do so.