summaryrefslogtreecommitdiff
path: root/pod/perlfaq5.pod
diff options
context:
space:
mode:
Diffstat (limited to 'pod/perlfaq5.pod')
-rw-r--r--pod/perlfaq5.pod51
1 files changed, 26 insertions, 25 deletions
diff --git a/pod/perlfaq5.pod b/pod/perlfaq5.pod
index e0f9da485b..76b6d3e0e2 100644
--- a/pod/perlfaq5.pod
+++ b/pod/perlfaq5.pod
@@ -1118,26 +1118,6 @@ to each filehandle.
=head2 How can I read in an entire file all at once?
X<slurp> X<file, slurping>
-Are you sure you want to read the entire file and store it in memory?
-If you mmap the file, you can virtually load the entire file into a
-string without actually storing it in memory:
-
- use File::Map qw(map_file);
-
- map_file my $string, $filename;
-
-Once mapped, you can treat C<$string> as you would any other string.
-Since you don't necessarily have to load the data, mmap-ing can be
-very fast and may not increase your memory footprint.
-
-If you want to load the entire file, you can use the C<File::Slurp>
-module to do it in one one simple and efficient step:
-
- use File::Slurp;
-
- my $all_of_it = read_file($filename); # entire file in scalar
- my @all_lines = read_file($filename); # one line per element
-
The customary Perl approach for processing all the lines in a file is to
do so one line at a time:
@@ -1156,13 +1136,35 @@ you see someone do this:
my @lines = <INPUT>;
You should think long and hard about why you need everything loaded at
-once. It's just not a scalable solution. You might also find it more
+once. It's just not a scalable solution.
+
+If you "mmap" the file with the File::Map module from
+CPAN, you can virtually load the entire file into a
+string without actually storing it in memory:
+
+ use File::Map qw(map_file);
+
+ map_file my $string, $filename;
+
+Once mapped, you can treat C<$string> as you would any other string.
+Since you don't necessarily have to load the data, mmap-ing can be
+very fast and may not increase your memory footprint.
+
+You might also find it more
fun to use the standard C<Tie::File> module, or the C<DB_File> module's
C<$DB_RECNO> bindings, which allow you to tie an array to a file so that
accessing an element of the array actually accesses the corresponding
line in the file.
-You can read the entire filehandle contents into a scalar.
+If you want to load the entire file, you can use the C<File::Slurp>
+module to do it in one one simple and efficient step:
+
+ use File::Slurp;
+
+ my $all_of_it = read_file($filename); # entire file in scalar
+ my @all_lines = read_file($filename); # one line per element
+
+Or you can read the entire file contents into a scalar like this:
my $var;
{
@@ -1176,8 +1178,7 @@ close the file at block exit. If the file is already open, just use this:
my $var = do { local $/; <$fh> };
-You can do that one better by using a localized C<@ARGV> so you can
-eliminate the C<open>:
+You can also use a localized C<@ARGV> to eliminate the C<open>:
my $var = do { local( @ARGV, $/ ) = $file; <> };
@@ -1185,7 +1186,7 @@ For ordinary files you can also use the C<read> function.
read( $fh, $var, -s $fh );
-That third argument tests the byte size of the data on the C<INPUT> filehandle
+That third argument tests the byte size of the data on the C<$fh> filehandle
and reads that many bytes into the buffer C<$var>.
=head2 How can I read in a file by paragraphs?