updated changes file
[urisagit/Perl-Docs.git] / lib / File / Slurp.pm
CommitLineData
635c7876 1package File::Slurp;
2
e2c51d31 3my $printed ;
4
635c7876 5use strict;
6
7use Carp ;
635c7876 8use Fcntl qw( :DEFAULT ) ;
e2c51d31 9use POSIX qw( :fcntl_h ) ;
635c7876 10use Symbol ;
11
e2c51d31 12use base 'Exporter' ;
13use vars qw( %EXPORT_TAGS @EXPORT_OK $VERSION @EXPORT ) ;
14
15%EXPORT_TAGS = ( 'all' => [
16 qw( read_file write_file overwrite_file append_file read_dir ) ] ) ;
17
18@EXPORT = ( @{ $EXPORT_TAGS{'all'} } );
19@EXPORT_OK = qw( slurp ) ;
20
8ed110f9 21$VERSION = '9999.14';
e2c51d31 22
635c7876 23my $is_win32 = $^O =~ /win32/i ;
24
25# Install subs for various constants that aren't set in older perls
26# (< 5.005). Fcntl on old perls uses Exporter to define subs without a
27# () prototype These can't be overridden with the constant pragma or
28# we get a prototype mismatch. Hence this less than aesthetically
29# appealing BEGIN block:
30
31BEGIN {
8ed110f9 32 unless( defined &SEEK_SET ) {
635c7876 33 *SEEK_SET = sub { 0 };
34 *SEEK_CUR = sub { 1 };
35 *SEEK_END = sub { 2 };
36 }
37
8ed110f9 38 unless( defined &O_BINARY ) {
635c7876 39 *O_BINARY = sub { 0 };
40 *O_RDONLY = sub { 0 };
41 *O_WRONLY = sub { 1 };
42 }
43
8ed110f9 44 unless ( defined O_APPEND ) {
635c7876 45
46 if ( $^O =~ /olaris/ ) {
47 *O_APPEND = sub { 8 };
48 *O_CREAT = sub { 256 };
49 *O_EXCL = sub { 1024 };
50 }
51 elsif ( $^O =~ /inux/ ) {
52 *O_APPEND = sub { 1024 };
53 *O_CREAT = sub { 64 };
54 *O_EXCL = sub { 128 };
55 }
56 elsif ( $^O =~ /BSD/i ) {
57 *O_APPEND = sub { 8 };
58 *O_CREAT = sub { 512 };
59 *O_EXCL = sub { 2048 };
60 }
61 }
62}
63
64# print "OS [$^O]\n" ;
65
66# print "O_BINARY = ", O_BINARY(), "\n" ;
67# print "O_RDONLY = ", O_RDONLY(), "\n" ;
68# print "O_WRONLY = ", O_WRONLY(), "\n" ;
69# print "O_APPEND = ", O_APPEND(), "\n" ;
70# print "O_CREAT ", O_CREAT(), "\n" ;
71# print "O_EXCL ", O_EXCL(), "\n" ;
72
635c7876 73
74*slurp = \&read_file ;
75
76sub read_file {
77
78 my( $file_name, %args ) = @_ ;
79
8ed110f9 80 if ( !ref $file_name && 0 &&
81 -e $file_name && -s _ < 10000 && ! %args && !wantarray ) {
e2c51d31 82
83 local( *FH ) ;
84
e2c51d31 85 unless( open( FH, $file_name ) ) {
86
87 @_ = ( \%args, "read_file '$file_name' - sysopen: $!");
88 goto &_error ;
89 }
90
e2c51d31 91 my $read_cnt = sysread( FH, my $buf, -s _ ) ;
92
93 unless ( defined $read_cnt ) {
94
95# handle the read error
96
8ed110f9 97 @_ = ( \%args,
98 "read_file '$file_name' - small sysread: $!");
e2c51d31 99 goto &_error ;
100 }
101
102 return $buf ;
103 }
104
635c7876 105# set the buffer to either the passed in one or ours and init it to the null
106# string
107
108 my $buf ;
109 my $buf_ref = $args{'buf_ref'} || \$buf ;
110 ${$buf_ref} = '' ;
111
112 my( $read_fh, $size_left, $blk_size ) ;
113
114# check if we are reading from a handle (glob ref or IO:: object)
115
116 if ( ref $file_name ) {
117
118# slurping a handle so use it and don't open anything.
119# set the block size so we know it is a handle and read that amount
120
121 $read_fh = $file_name ;
122 $blk_size = $args{'blk_size'} || 1024 * 1024 ;
123 $size_left = $blk_size ;
124
125# DEEP DARK MAGIC. this checks the UNTAINT IO flag of a
126# glob/handle. only the DATA handle is untainted (since it is from
127# trusted data in the source file). this allows us to test if this is
128# the DATA handle and then to do a sysseek to make sure it gets
129# slurped correctly. on some systems, the buffered i/o pointer is not
130# left at the same place as the fd pointer. this sysseek makes them
131# the same so slurping with sysread will work.
132
133 eval{ require B } ;
134
135 if ( $@ ) {
136
137 @_ = ( \%args, <<ERR ) ;
138Can't find B.pm with this Perl: $!.
139That module is needed to slurp the DATA handle.
140ERR
141 goto &_error ;
142 }
143
144 if ( B::svref_2object( $read_fh )->IO->IoFLAGS & 16 ) {
145
146# set the seek position to the current tell.
147
148 sysseek( $read_fh, tell( $read_fh ), SEEK_SET ) ||
149 croak "sysseek $!" ;
150 }
151 }
152 else {
153
154# a regular file. set the sysopen mode
155
156 my $mode = O_RDONLY ;
635c7876 157
158#printf "RD: BINARY %x MODE %x\n", O_BINARY, $mode ;
159
160# open the file and handle any error
161
162 $read_fh = gensym ;
163 unless ( sysopen( $read_fh, $file_name, $mode ) ) {
164 @_ = ( \%args, "read_file '$file_name' - sysopen: $!");
165 goto &_error ;
166 }
167
cee624ab 168 if ( my $binmode = $args{'binmode'} ) {
169 binmode( $read_fh, $binmode ) ;
170 }
171
635c7876 172# get the size of the file for use in the read loop
173
174 $size_left = -s $read_fh ;
175
f9940db7 176#print "SIZE $size_left\n" ;
8ed110f9 177
635c7876 178
f9940db7 179# we need a blk_size if the size is 0 so we can handle pseudofiles like in
180# /proc. these show as 0 size but have data to be slurped.
181
182 unless( $size_left ) {
183
184 $blk_size = $args{'blk_size'} || 1024 * 1024 ;
185 $size_left = $blk_size ;
186 }
e2c51d31 187 }
188
189
8ed110f9 190# if ( $size_left < 10000 && keys %args == 0 && !wantarray ) {
e2c51d31 191
8ed110f9 192# #print "OPT\n" and $printed++ unless $printed ;
e2c51d31 193
8ed110f9 194# my $read_cnt = sysread( $read_fh, my $buf, $size_left ) ;
e2c51d31 195
8ed110f9 196# unless ( defined $read_cnt ) {
e2c51d31 197
8ed110f9 198# # handle the read error
e2c51d31 199
8ed110f9 200# @_ = ( \%args, "read_file '$file_name' - small2 sysread: $!");
201# goto &_error ;
202# }
e2c51d31 203
8ed110f9 204# return $buf ;
205# }
635c7876 206
207# infinite read loop. we exit when we are done slurping
208
209 while( 1 ) {
210
211# do the read and see how much we got
212
213 my $read_cnt = sysread( $read_fh, ${$buf_ref},
214 $size_left, length ${$buf_ref} ) ;
215
e2c51d31 216 unless ( defined $read_cnt ) {
217
218# handle the read error
219
8ed110f9 220 @_ = ( \%args, "read_file '$file_name' - loop sysread: $!");
e2c51d31 221 goto &_error ;
222 }
635c7876 223
224# good read. see if we hit EOF (nothing left to read)
225
e2c51d31 226 last if $read_cnt == 0 ;
635c7876 227
228# loop if we are slurping a handle. we don't track $size_left then.
229
e2c51d31 230 next if $blk_size ;
635c7876 231
232# count down how much we read and loop if we have more to read.
635c7876 233
e2c51d31 234 $size_left -= $read_cnt ;
235 last if $size_left <= 0 ;
635c7876 236 }
237
238# fix up cr/lf to be a newline if this is a windows text file
239
240 ${$buf_ref} =~ s/\015\012/\n/g if $is_win32 && !$args{'binmode'} ;
241
242# this is the 5 returns in a row. each handles one possible
243# combination of caller context and requested return type
244
245 my $sep = $/ ;
246 $sep = '\n\n+' if defined $sep && $sep eq '' ;
247
248# caller wants to get an array ref of lines
249
250# this split doesn't work since it tries to use variable length lookbehind
251# the m// line works.
252# return [ split( m|(?<=$sep)|, ${$buf_ref} ) ] if $args{'array_ref'} ;
253 return [ length(${$buf_ref}) ? ${$buf_ref} =~ /(.*?$sep|.+)/sg : () ]
254 if $args{'array_ref'} ;
255
256# caller wants a list of lines (normal list context)
257
258# same problem with this split as before.
259# return split( m|(?<=$sep)|, ${$buf_ref} ) if wantarray ;
260 return length(${$buf_ref}) ? ${$buf_ref} =~ /(.*?$sep|.+)/sg : ()
261 if wantarray ;
262
263# caller wants a scalar ref to the slurped text
264
265 return $buf_ref if $args{'scalar_ref'} ;
266
267# caller wants a scalar with the slurped text (normal scalar context)
268
269 return ${$buf_ref} if defined wantarray ;
270
271# caller passed in an i/o buffer by reference (normal void context)
272
273 return ;
274}
275
276sub write_file {
277
278 my $file_name = shift ;
279
280# get the optional argument hash ref from @_ or an empty hash ref.
281
282 my $args = ( ref $_[0] eq 'HASH' ) ? shift : {} ;
283
284 my( $buf_ref, $write_fh, $no_truncate, $orig_file_name, $data_is_ref ) ;
285
286# get the buffer ref - it depends on how the data is passed into write_file
287# after this if/else $buf_ref will have a scalar ref to the data.
288
289 if ( ref $args->{'buf_ref'} eq 'SCALAR' ) {
290
291# a scalar ref passed in %args has the data
292# note that the data was passed by ref
293
294 $buf_ref = $args->{'buf_ref'} ;
295 $data_is_ref = 1 ;
296 }
297 elsif ( ref $_[0] eq 'SCALAR' ) {
298
299# the first value in @_ is the scalar ref to the data
300# note that the data was passed by ref
301
302 $buf_ref = shift ;
303 $data_is_ref = 1 ;
304 }
305 elsif ( ref $_[0] eq 'ARRAY' ) {
306
307# the first value in @_ is the array ref to the data so join it.
308
309 ${$buf_ref} = join '', @{$_[0]} ;
310 }
311 else {
312
313# good old @_ has all the data so join it.
314
315 ${$buf_ref} = join '', @_ ;
316 }
317
318# see if we were passed a open handle to spew to.
319
320 if ( ref $file_name ) {
321
322# we have a handle. make sure we don't call truncate on it.
323
324 $write_fh = $file_name ;
325 $no_truncate = 1 ;
326 }
327 else {
328
329# spew to regular file.
330
331 if ( $args->{'atomic'} ) {
332
333# in atomic mode, we spew to a temp file so make one and save the original
334# file name.
335 $orig_file_name = $file_name ;
336 $file_name .= ".$$" ;
337 }
338
339# set the mode for the sysopen
340
341 my $mode = O_WRONLY | O_CREAT ;
635c7876 342 $mode |= O_APPEND if $args->{'append'} ;
343 $mode |= O_EXCL if $args->{'no_clobber'} ;
344
345#printf "WR: BINARY %x MODE %x\n", O_BINARY, $mode ;
346
347# open the file and handle any error.
348
349 $write_fh = gensym ;
350 unless ( sysopen( $write_fh, $file_name, $mode ) ) {
351 @_ = ( $args, "write_file '$file_name' - sysopen: $!");
352 goto &_error ;
353 }
354 }
355
cee624ab 356 if ( my $binmode = $args{'binmode'} ) {
357 binmode( $write_fh, $binmode ) ;
358 }
359
635c7876 360 sysseek( $write_fh, 0, SEEK_END ) if $args->{'append'} ;
361
362
363#print 'WR before data ', unpack( 'H*', ${$buf_ref}), "\n" ;
364
365# fix up newline to write cr/lf if this is a windows text file
366
367 if ( $is_win32 && !$args->{'binmode'} ) {
368
369# copy the write data if it was passed by ref so we don't clobber the
370# caller's data
371 $buf_ref = \do{ my $copy = ${$buf_ref}; } if $data_is_ref ;
372 ${$buf_ref} =~ s/\n/\015\012/g ;
373 }
374
375#print 'after data ', unpack( 'H*', ${$buf_ref}), "\n" ;
376
377# get the size of how much we are writing and init the offset into that buffer
378
379 my $size_left = length( ${$buf_ref} ) ;
380 my $offset = 0 ;
381
382# loop until we have no more data left to write
383
384 do {
385
386# do the write and track how much we just wrote
387
388 my $write_cnt = syswrite( $write_fh, ${$buf_ref},
389 $size_left, $offset ) ;
390
391 unless ( defined $write_cnt ) {
392
393# the write failed
394 @_ = ( $args, "write_file '$file_name' - syswrite: $!");
395 goto &_error ;
396 }
397
398# track much left to write and where to write from in the buffer
399
400 $size_left -= $write_cnt ;
401 $offset += $write_cnt ;
402
403 } while( $size_left > 0 ) ;
404
405# we truncate regular files in case we overwrite a long file with a shorter file
406# so seek to the current position to get it (same as tell()).
407
408 truncate( $write_fh,
409 sysseek( $write_fh, 0, SEEK_CUR ) ) unless $no_truncate ;
410
411 close( $write_fh ) ;
412
413# handle the atomic mode - move the temp file to the original filename.
414
e2c51d31 415 if ( $args->{'atomic'} && !rename( $file_name, $orig_file_name ) ) {
416
417
418 @_ = ( $args, "write_file '$file_name' - rename: $!" ) ;
419 goto &_error ;
420 }
635c7876 421
422 return 1 ;
423}
424
425# this is for backwards compatibility with the previous File::Slurp module.
426# write_file always overwrites an existing file
427
428*overwrite_file = \&write_file ;
429
430# the current write_file has an append mode so we use that. this
431# supports the same API with an optional second argument which is a
432# hash ref of options.
433
434sub append_file {
435
436# get the optional args hash ref
437 my $args = $_[1] ;
438 if ( ref $args eq 'HASH' ) {
439
440# we were passed an args ref so just mark the append mode
441
442 $args->{append} = 1 ;
443 }
444 else {
445
446# no args hash so insert one with the append mode
447
448 splice( @_, 1, 0, { append => 1 } ) ;
449 }
450
451# magic goto the main write_file sub. this overlays the sub without touching
452# the stack or @_
453
454 goto &write_file
455}
456
457# basic wrapper around opendir/readdir
458
459sub read_dir {
460
461 my ($dir, %args ) = @_;
462
463# this handle will be destroyed upon return
464
465 local(*DIRH);
466
467# open the dir and handle any errors
468
469 unless ( opendir( DIRH, $dir ) ) {
470
471 @_ = ( \%args, "read_dir '$dir' - opendir: $!" ) ;
472 goto &_error ;
473 }
474
475 my @dir_entries = readdir(DIRH) ;
476
477 @dir_entries = grep( $_ ne "." && $_ ne "..", @dir_entries )
478 unless $args{'keep_dot_dot'} ;
479
480 return @dir_entries if wantarray ;
481 return \@dir_entries ;
482}
483
484# error handling section
485#
486# all the error handling uses magic goto so the caller will get the
487# error message as if from their code and not this module. if we just
488# did a call on the error code, the carp/croak would report it from
489# this module since the error sub is one level down on the call stack
490# from read_file/write_file/read_dir.
491
492
493my %err_func = (
494 'carp' => \&carp,
495 'croak' => \&croak,
496) ;
497
498sub _error {
499
500 my( $args, $err_msg ) = @_ ;
501
502# get the error function to use
503
504 my $func = $err_func{ $args->{'err_mode'} || 'croak' } ;
505
506# if we didn't find it in our error function hash, they must have set
507# it to quiet and we don't do anything.
508
509 return unless $func ;
510
511# call the carp/croak function
512
513 $func->($err_msg) ;
514
515# return a hard undef (in list context this will be a single value of
516# undef which is not a legal in-band value)
517
518 return undef ;
519}
520
5211;
522__END__
523
524=head1 NAME
525
526File::Slurp - Efficient Reading/Writing of Complete Files
527
528=head1 SYNOPSIS
529
530 use File::Slurp;
531
532 my $text = read_file( 'filename' ) ;
533 my @lines = read_file( 'filename' ) ;
534
535 write_file( 'filename', @lines ) ;
536
537 use File::Slurp qw( slurp ) ;
538
539 my $text = slurp( 'filename' ) ;
540
541
542=head1 DESCRIPTION
543
544This module provides subs that allow you to read or write entire files
545with one simple call. They are designed to be simple to use, have
546flexible ways to pass in or get the file contents and to be very
547efficient. There is also a sub to read in all the files in a
548directory other than C<.> and C<..>
549
550These slurp/spew subs work for files, pipes and
551sockets, and stdio, pseudo-files, and DATA.
552
553=head2 B<read_file>
554
555This sub reads in an entire file and returns its contents to the
556caller. In list context it will return a list of lines (using the
557current value of $/ as the separator including support for paragraph
558mode when it is set to ''). In scalar context it returns the entire
559file as a single scalar.
560
561 my $text = read_file( 'filename' ) ;
562 my @lines = read_file( 'filename' ) ;
563
564The first argument to C<read_file> is the filename and the rest of the
565arguments are key/value pairs which are optional and which modify the
566behavior of the call. Other than binmode the options all control how
567the slurped file is returned to the caller.
568
569If the first argument is a file handle reference or I/O object (if ref
570is true), then that handle is slurped in. This mode is supported so
571you slurp handles such as C<DATA>, C<STDIN>. See the test handle.t
572for an example that does C<open( '-|' )> and child process spews data
573to the parant which slurps it in. All of the options that control how
574the data is returned to the caller still work in this case.
575
576NOTE: as of version 9999.06, read_file works correctly on the C<DATA>
577handle. It used to need a sysseek workaround but that is now handled
578when needed by the module itself.
579
580You can optionally request that C<slurp()> is exported to your code. This
581is an alias for read_file and is meant to be forward compatible with
582Perl 6 (which will have slurp() built-in).
583
584The options are:
585
586=head3 binmode
587
588If you set the binmode option, then the file will be slurped in binary
589mode.
590
591 my $bin_data = read_file( $bin_file, binmode => ':raw' ) ;
592
593NOTE: this actually sets the O_BINARY mode flag for sysopen. It
594probably should call binmode and pass its argument to support other
595file modes.
596
597=head3 array_ref
598
599If this boolean option is set, the return value (only in scalar
600context) will be an array reference which contains the lines of the
601slurped file. The following two calls are equivalent:
602
603 my $lines_ref = read_file( $bin_file, array_ref => 1 ) ;
604 my $lines_ref = [ read_file( $bin_file ) ] ;
605
606=head3 scalar_ref
607
608If this boolean option is set, the return value (only in scalar
609context) will be an scalar reference to a string which is the contents
610of the slurped file. This will usually be faster than returning the
611plain scalar.
612
613 my $text_ref = read_file( $bin_file, scalar_ref => 1 ) ;
614
615=head3 buf_ref
616
617You can use this option to pass in a scalar reference and the slurped
618file contents will be stored in the scalar. This can be used in
619conjunction with any of the other options.
620
621 my $text_ref = read_file( $bin_file, buf_ref => \$buffer,
622 array_ref => 1 ) ;
623 my @lines = read_file( $bin_file, buf_ref => \$buffer ) ;
624
625=head3 blk_size
626
627You can use this option to set the block size used when slurping from an already open handle (like \*STDIN). It defaults to 1MB.
628
629 my $text_ref = read_file( $bin_file, blk_size => 10_000_000,
630 array_ref => 1 ) ;
631
632=head3 err_mode
633
634You can use this option to control how read_file behaves when an error
635occurs. This option defaults to 'croak'. You can set it to 'carp' or
636to 'quiet to have no error handling. This code wants to carp and then
637read abother file if it fails.
638
639 my $text_ref = read_file( $file, err_mode => 'carp' ) ;
640 unless ( $text_ref ) {
641
642 # read a different file but croak if not found
643 $text_ref = read_file( $another_file ) ;
644 }
645
646 # process ${$text_ref}
647
648=head2 B<write_file>
649
650This sub writes out an entire file in one call.
651
652 write_file( 'filename', @data ) ;
653
654The first argument to C<write_file> is the filename. The next argument
655is an optional hash reference and it contains key/values that can
656modify the behavior of C<write_file>. The rest of the argument list is
657the data to be written to the file.
658
659 write_file( 'filename', {append => 1 }, @data ) ;
660 write_file( 'filename', {binmode => ':raw' }, $buffer ) ;
661
662As a shortcut if the first data argument is a scalar or array
663reference, it is used as the only data to be written to the file. Any
664following arguments in @_ are ignored. This is a faster way to pass in
665the output to be written to the file and is equivilent to the
666C<buf_ref> option. These following pairs are equivilent but the pass
667by reference call will be faster in most cases (especially with larger
668files).
669
670 write_file( 'filename', \$buffer ) ;
671 write_file( 'filename', $buffer ) ;
672
673 write_file( 'filename', \@lines ) ;
674 write_file( 'filename', @lines ) ;
675
676If the first argument is a file handle reference or I/O object (if ref
677is true), then that handle is slurped in. This mode is supported so
678you spew to handles such as \*STDOUT. See the test handle.t for an
679example that does C<open( '-|' )> and child process spews data to the
680parant which slurps it in. All of the options that control how the
681data is passes into C<write_file> still work in this case.
682
683C<write_file> returns 1 upon successfully writing the file or undef if
684it encountered an error.
685
686The options are:
687
688=head3 binmode
689
690If you set the binmode option, then the file will be written in binary
691mode.
692
693 write_file( $bin_file, {binmode => ':raw'}, @data ) ;
694
695NOTE: this actually sets the O_BINARY mode flag for sysopen. It
696probably should call binmode and pass its argument to support other
697file modes.
698
699=head3 buf_ref
700
701You can use this option to pass in a scalar reference which has the
702data to be written. If this is set then any data arguments (including
703the scalar reference shortcut) in @_ will be ignored. These are
704equivilent:
705
706 write_file( $bin_file, { buf_ref => \$buffer } ) ;
707 write_file( $bin_file, \$buffer ) ;
708 write_file( $bin_file, $buffer ) ;
709
710=head3 atomic
711
712If you set this boolean option, the file will be written to in an
713atomic fashion. A temporary file name is created by appending the pid
714($$) to the file name argument and that file is spewed to. After the
715file is closed it is renamed to the original file name (and rename is
716an atomic operation on most OS's). If the program using this were to
717crash in the middle of this, then the file with the pid suffix could
718be left behind.
719
720=head3 append
721
722If you set this boolean option, the data will be written at the end of
723the current file.
724
725 write_file( $file, {append => 1}, @data ) ;
726
727C<write_file> croaks if it cannot open the file. It returns true if it
728succeeded in writing out the file and undef if there was an
729error. (Yes, I know if it croaks it can't return anything but that is
730for when I add the options to select the error handling mode).
731
732=head3 no_clobber
733
734If you set this boolean option, an existing file will not be overwritten.
735
736 write_file( $file, {no_clobber => 1}, @data ) ;
737
738=head3 err_mode
739
740You can use this option to control how C<write_file> behaves when an
741error occurs. This option defaults to 'croak'. You can set it to
742'carp' or to 'quiet' to have no error handling other than the return
743value. If the first call to C<write_file> fails it will carp and then
744write to another file. If the second call to C<write_file> fails, it
745will croak.
746
747 unless ( write_file( $file, { err_mode => 'carp', \$data ) ;
748
749 # write a different file but croak if not found
750 write_file( $other_file, \$data ) ;
751 }
752
753=head2 overwrite_file
754
755This sub is just a typeglob alias to write_file since write_file
756always overwrites an existing file. This sub is supported for
757backwards compatibility with the original version of this module. See
758write_file for its API and behavior.
759
760=head2 append_file
761
762This sub will write its data to the end of the file. It is a wrapper
763around write_file and it has the same API so see that for the full
764documentation. These calls are equivilent:
765
766 append_file( $file, @data ) ;
767 write_file( $file, {append => 1}, @data ) ;
768
769=head2 read_dir
770
771This sub reads all the file names from directory and returns them to
772the caller but C<.> and C<..> are removed by default.
773
774 my @files = read_dir( '/path/to/dir' ) ;
775
776It croaks if it cannot open the directory.
777
778In a list context C<read_dir> returns a list of the entries in the
779directory. In a scalar context it returns an array reference which has
780the entries.
781
782=head3 keep_dot_dot
783
784If this boolean option is set, C<.> and C<..> are not removed from the
785list of files.
786
787 my @all_files = read_dir( '/path/to/dir', keep_dot_dot => 1 ) ;
788
789=head2 EXPORT
790
791 read_file write_file overwrite_file append_file read_dir
792
793=head2 SEE ALSO
794
795An article on file slurping in extras/slurp_article.pod. There is
796also a benchmarking script in extras/slurp_bench.pl.
797
798=head2 BUGS
799
800If run under Perl 5.004, slurping from the DATA handle will fail as
801that requires B.pm which didn't get into core until 5.005.
802
803=head1 AUTHOR
804
805Uri Guttman, E<lt>uri@stemsystems.comE<gt>
806
807=cut