FAQ sync.
[p5sagit/p5-mst-13.2.git] / pod / perlfaq5.pod
CommitLineData
68dc0745 1=head1 NAME
2
9e72e4c6 3perlfaq5 - Files and Formats ($Revision: 1.38 $, $Date: 2005/10/13 19:49:13 $)
68dc0745 4
5=head1 DESCRIPTION
6
7This section deals with I/O and the "f" issues: filehandles, flushing,
8formats, and footers.
9
5a964f20 10=head2 How do I flush/unbuffer an output filehandle? Why must I do this?
d74e8afc 11X<flush> X<buffer> X<unbuffer> X<autoflush>
68dc0745 12
c90536be 13Perl does not support truly unbuffered output (except
14insofar as you can C<syswrite(OUT, $char, 1)>), although it
15does support is "command buffering", in which a physical
16write is performed after every output command.
17
18The C standard I/O library (stdio) normally buffers
19characters sent to devices so that there isn't a system call
20for each byte. In most stdio implementations, the type of
21output buffering and the size of the buffer varies according
22to the type of device. Perl's print() and write() functions
23normally buffer output, while syswrite() bypasses buffering
24all together.
25
26If you want your output to be sent immediately when you
27execute print() or write() (for instance, for some network
28protocols), you must set the handle's autoflush flag. This
29flag is the Perl variable $| and when it is set to a true
30value, Perl will flush the handle's buffer after each
31print() or write(). Setting $| affects buffering only for
32the currently selected default file handle. You choose this
33handle with the one argument select() call (see
197aec24 34L<perlvar/$E<verbar>> and L<perlfunc/select>).
c90536be 35
36Use select() to choose the desired handle, then set its
37per-filehandle variables.
5a964f20 38
39 $old_fh = select(OUTPUT_HANDLE);
40 $| = 1;
41 select($old_fh);
42
c90536be 43Some idioms can handle this in a single statement:
5a964f20 44
45 select((select(OUTPUT_HANDLE), $| = 1)[0]);
818c4caa 46
c90536be 47 $| = 1, select $_ for select OUTPUT_HANDLE;
5a964f20 48
c90536be 49Some modules offer object-oriented access to handles and their
50variables, although they may be overkill if this is the only
51thing you do with them. You can use IO::Handle:
68dc0745 52
53 use IO::Handle;
54 open(DEV, ">/dev/printer"); # but is this?
55 DEV->autoflush(1);
56
c90536be 57or IO::Socket:
68dc0745 58
59 use IO::Socket; # this one is kinda a pipe?
c90536be 60 my $sock = IO::Socket::INET->new( 'www.example.com:80' ) ;
68dc0745 61
62 $sock->autoflush();
68dc0745 63
64=head2 How do I change one line in a file/delete a line in a file/insert a line in the middle of a file/append to the beginning of a file?
d74e8afc 65X<file, editing>
68dc0745 66
1f089b22 67Use the Tie::File module, which is included in the standard
68distribution since Perl 5.8.0.
68dc0745 69
70=head2 How do I count the number of lines in a file?
d74e8afc 71X<file, counting lines> X<lines> X<line>
68dc0745 72
73One fairly efficient way is to count newlines in the file. The
74following program uses a feature of tr///, as documented in L<perlop>.
75If your text file doesn't end with a newline, then it's not really a
76proper text file, so this may report one fewer line than you expect.
77
78 $lines = 0;
79 open(FILE, $filename) or die "Can't open `$filename': $!";
80 while (sysread FILE, $buffer, 4096) {
81 $lines += ($buffer =~ tr/\n//);
82 }
83 close FILE;
84
5a964f20 85This assumes no funny games with newline translations.
86
4750257b 87=head2 How can I use Perl's C<-i> option from within a program?
d74e8afc 88X<-i> X<in-place>
4750257b 89
90C<-i> sets the value of Perl's C<$^I> variable, which in turn affects
91the behavior of C<< <> >>; see L<perlrun> for more details. By
92modifying the appropriate variables directly, you can get the same
93behavior within a larger program. For example:
94
95 # ...
96 {
97 local($^I, @ARGV) = ('.orig', glob("*.c"));
98 while (<>) {
99 if ($. == 1) {
100 print "This line should appear at the top of each file\n";
101 }
102 s/\b(p)earl\b/${1}erl/i; # Correct typos, preserving case
103 print;
104 close ARGV if eof; # Reset $.
105 }
106 }
107 # $^I and @ARGV return to their old values here
108
109This block modifies all the C<.c> files in the current directory,
110leaving a backup of the original data from each file in a new
111C<.c.orig> file.
112
7678cced 113=head2 How can I copy a file?
d74e8afc 114X<copy> X<file, copy>
7678cced 115
116(contributed by brian d foy)
117
118Use the File::Copy module. It comes with Perl and can do a
119true copy across file systems, and it does its magic in
120a portable fashion.
121
122 use File::Copy;
123
124 copy( $original, $new_copy ) or die "Copy failed: $!";
125
126If you can't use File::Copy, you'll have to do the work yourself:
127open the original file, open the destination file, then print
128to the destination file as you read the original.
129
68dc0745 130=head2 How do I make a temporary file name?
d74e8afc 131X<file, temporary>
68dc0745 132
7678cced 133If you don't need to know the name of the file, you can use C<open()>
134with C<undef> in place of the file name. The C<open()> function
135creates an anonymous temporary file.
136
137 open my $tmp, '+>', undef or die $!;
6670e5e7 138
7678cced 139Otherwise, you can use the File::Temp module.
68dc0745 140
197aec24 141 use File::Temp qw/ tempfile tempdir /;
a6dd486b 142
16394a69 143 $dir = tempdir( CLEANUP => 1 );
144 ($fh, $filename) = tempfile( DIR => $dir );
5a964f20 145
16394a69 146 # or if you don't need to know the filename
5a964f20 147
16394a69 148 $fh = tempfile( DIR => $dir );
5a964f20 149
16394a69 150The File::Temp has been a standard module since Perl 5.6.1. If you
151don't have a modern enough Perl installed, use the C<new_tmpfile>
152class method from the IO::File module to get a filehandle opened for
153reading and writing. Use it if you don't need to know the file's name:
5a964f20 154
16394a69 155 use IO::File;
156 $fh = IO::File->new_tmpfile()
157 or die "Unable to make new temporary file: $!";
5a964f20 158
a6dd486b 159If you're committed to creating a temporary file by hand, use the
160process ID and/or the current time-value. If you need to have many
161temporary files in one process, use a counter:
5a964f20 162
163 BEGIN {
68dc0745 164 use Fcntl;
16394a69 165 my $temp_dir = -d '/tmp' ? '/tmp' : $ENV{TMPDIR} || $ENV{TEMP};
68dc0745 166 my $base_name = sprintf("%s/%d-%d-0000", $temp_dir, $$, time());
167 sub temp_file {
5a964f20 168 local *FH;
68dc0745 169 my $count = 0;
5a964f20 170 until (defined(fileno(FH)) || $count++ > 100) {
68dc0745 171 $base_name =~ s/-(\d+)$/"-" . (1 + $1)/e;
2359510d 172 # O_EXCL is required for security reasons.
5a964f20 173 sysopen(FH, $base_name, O_WRONLY|O_EXCL|O_CREAT);
68dc0745 174 }
5a964f20 175 if (defined(fileno(FH))
176 return (*FH, $base_name);
68dc0745 177 } else {
178 return ();
179 }
180 }
181 }
182
68dc0745 183=head2 How can I manipulate fixed-record-length files?
d74e8afc 184X<fixed-length> X<file, fixed-length records>
68dc0745 185
793f5136 186The most efficient way is using L<pack()|perlfunc/"pack"> and
187L<unpack()|perlfunc/"unpack">. This is faster than using
188L<substr()|perlfunc/"substr"> when taking many, many strings. It is
189slower for just a few.
5a964f20 190
191Here is a sample chunk of code to break up and put back together again
192some fixed-format input lines, in this case from the output of a normal,
193Berkeley-style ps:
68dc0745 194
195 # sample input line:
196 # 15158 p5 T 0:00 perl /home/tchrist/scripts/now-what
793f5136 197 my $PS_T = 'A6 A4 A7 A5 A*';
198 open my $ps, '-|', 'ps';
199 print scalar <$ps>;
200 my @fields = qw( pid tt stat time command );
201 while (<$ps>) {
202 my %process;
203 @process{@fields} = unpack($PS_T, $_);
204 for my $field ( @fields ) {
205 print "$field: <$process{$field}>\n";
68dc0745 206 }
793f5136 207 print 'line=', pack($PS_T, @process{@fields} ), "\n";
68dc0745 208 }
209
793f5136 210We've used a hash slice in order to easily handle the fields of each row.
211Storing the keys in an array means it's easy to operate on them as a
212group or loop over them with for. It also avoids polluting the program
213with global variables and using symbolic references.
5a964f20 214
68dc0745 215=head2 How can I make a filehandle local to a subroutine? How do I pass filehandles between subroutines? How do I make an array of filehandles?
d74e8afc 216X<filehandle, local> X<filehandle, passing> X<filehandle, reference>
68dc0745 217
c90536be 218As of perl5.6, open() autovivifies file and directory handles
219as references if you pass it an uninitialized scalar variable.
220You can then pass these references just like any other scalar,
221and use them in the place of named handles.
68dc0745 222
c90536be 223 open my $fh, $file_name;
818c4caa 224
c90536be 225 open local $fh, $file_name;
818c4caa 226
c90536be 227 print $fh "Hello World!\n";
818c4caa 228
c90536be 229 process_file( $fh );
68dc0745 230
c90536be 231Before perl5.6, you had to deal with various typeglob idioms
232which you may see in older code.
68dc0745 233
c90536be 234 open FILE, "> $filename";
235 process_typeglob( *FILE );
236 process_reference( \*FILE );
818c4caa 237
c90536be 238 sub process_typeglob { local *FH = shift; print FH "Typeglob!" }
239 sub process_reference { local $fh = shift; print $fh "Reference!" }
5a964f20 240
c90536be 241If you want to create many anonymous handles, you should
242check out the Symbol or IO::Handle modules.
5a964f20 243
244=head2 How can I use a filehandle indirectly?
d74e8afc 245X<filehandle, indirect>
5a964f20 246
247An indirect filehandle is using something other than a symbol
248in a place that a filehandle is expected. Here are ways
a6dd486b 249to get indirect filehandles:
5a964f20 250
251 $fh = SOME_FH; # bareword is strict-subs hostile
252 $fh = "SOME_FH"; # strict-refs hostile; same package only
253 $fh = *SOME_FH; # typeglob
254 $fh = \*SOME_FH; # ref to typeglob (bless-able)
255 $fh = *SOME_FH{IO}; # blessed IO::Handle from *SOME_FH typeglob
256
c90536be 257Or, you can use the C<new> method from one of the IO::* modules to
5a964f20 258create an anonymous filehandle, store that in a scalar variable,
259and use it as though it were a normal filehandle.
260
5a964f20 261 use IO::Handle; # 5.004 or higher
262 $fh = IO::Handle->new();
263
264Then use any of those as you would a normal filehandle. Anywhere that
265Perl is expecting a filehandle, an indirect filehandle may be used
266instead. An indirect filehandle is just a scalar variable that contains
368c9434 267a filehandle. Functions like C<print>, C<open>, C<seek>, or
c90536be 268the C<< <FH> >> diamond operator will accept either a named filehandle
5a964f20 269or a scalar variable containing one:
270
271 ($ifh, $ofh, $efh) = (*STDIN, *STDOUT, *STDERR);
272 print $ofh "Type it: ";
273 $got = <$ifh>
274 print $efh "What was that: $got";
275
368c9434 276If you're passing a filehandle to a function, you can write
5a964f20 277the function in two ways:
278
279 sub accept_fh {
280 my $fh = shift;
281 print $fh "Sending to indirect filehandle\n";
46fc3d4c 282 }
283
5a964f20 284Or it can localize a typeglob and use the filehandle directly:
46fc3d4c 285
5a964f20 286 sub accept_fh {
287 local *FH = shift;
288 print FH "Sending to localized filehandle\n";
46fc3d4c 289 }
290
5a964f20 291Both styles work with either objects or typeglobs of real filehandles.
292(They might also work with strings under some circumstances, but this
293is risky.)
294
295 accept_fh(*STDOUT);
296 accept_fh($handle);
297
298In the examples above, we assigned the filehandle to a scalar variable
a6dd486b 299before using it. That is because only simple scalar variables, not
300expressions or subscripts of hashes or arrays, can be used with
301built-ins like C<print>, C<printf>, or the diamond operator. Using
8305e449 302something other than a simple scalar variable as a filehandle is
5a964f20 303illegal and won't even compile:
304
305 @fd = (*STDIN, *STDOUT, *STDERR);
306 print $fd[1] "Type it: "; # WRONG
307 $got = <$fd[0]> # WRONG
308 print $fd[2] "What was that: $got"; # WRONG
309
310With C<print> and C<printf>, you get around this by using a block and
311an expression where you would place the filehandle:
312
313 print { $fd[1] } "funny stuff\n";
314 printf { $fd[1] } "Pity the poor %x.\n", 3_735_928_559;
315 # Pity the poor deadbeef.
316
317That block is a proper block like any other, so you can put more
318complicated code there. This sends the message out to one of two places:
319
197aec24 320 $ok = -x "/bin/cat";
5a964f20 321 print { $ok ? $fd[1] : $fd[2] } "cat stat $ok\n";
197aec24 322 print { $fd[ 1+ ($ok || 0) ] } "cat stat $ok\n";
5a964f20 323
324This approach of treating C<print> and C<printf> like object methods
325calls doesn't work for the diamond operator. That's because it's a
326real operator, not just a function with a comma-less argument. Assuming
327you've been storing typeglobs in your structure as we did above, you
c90536be 328can use the built-in function named C<readline> to read a record just
c47ff5f1 329as C<< <> >> does. Given the initialization shown above for @fd, this
c90536be 330would work, but only because readline() requires a typeglob. It doesn't
5a964f20 331work with objects or strings, which might be a bug we haven't fixed yet.
332
333 $got = readline($fd[0]);
334
335Let it be noted that the flakiness of indirect filehandles is not
336related to whether they're strings, typeglobs, objects, or anything else.
337It's the syntax of the fundamental operators. Playing the object
338game doesn't help you at all here.
46fc3d4c 339
68dc0745 340=head2 How can I set up a footer format to be used with write()?
d74e8afc 341X<footer>
68dc0745 342
54310121 343There's no builtin way to do this, but L<perlform> has a couple of
68dc0745 344techniques to make it possible for the intrepid hacker.
345
346=head2 How can I write() into a string?
d74e8afc 347X<write, into a string>
68dc0745 348
65acb1b1 349See L<perlform/"Accessing Formatting Internals"> for an swrite() function.
68dc0745 350
351=head2 How can I output my numbers with commas added?
d74e8afc 352X<number, commify>
68dc0745 353
b68463f7 354(contributed by brian d foy and Benjamin Goldberg)
355
356You can use L<Number::Format> to separate places in a number.
357It handles locale information for those of you who want to insert
358full stops instead (or anything else that they want to use,
359really).
360
49d635f9 361This subroutine will add commas to your number:
362
363 sub commify {
364 local $_ = shift;
365 1 while s/^([-+]?\d+)(\d{3})/$1,$2/;
366 return $_;
367 }
368
369This regex from Benjamin Goldberg will add commas to numbers:
68dc0745 370
881bdbd4 371 s/(^[-+]?\d+?(?=(?>(?:\d{3})+)(?!\d))|\G\d{3}(?=\d))/$1,/g;
68dc0745 372
49d635f9 373It is easier to see with comments:
68dc0745 374
881bdbd4 375 s/(
376 ^[-+]? # beginning of number.
7678cced 377 \d+? # first digits before first comma
881bdbd4 378 (?= # followed by, (but not included in the match) :
379 (?>(?:\d{3})+) # some positive multiple of three digits.
380 (?!\d) # an *exact* multiple, not x * 3 + 1 or whatever.
381 )
382 | # or:
383 \G\d{3} # after the last group, get three digits
384 (?=\d) # but they have to have more digits after them.
385 )/$1,/xg;
46fc3d4c 386
68dc0745 387=head2 How can I translate tildes (~) in a filename?
d74e8afc 388X<tilde> X<tilde expansion>
68dc0745 389
575cc754 390Use the <> (glob()) operator, documented in L<perlfunc>. Older
391versions of Perl require that you have a shell installed that groks
392tildes. Recent perl versions have this feature built in. The
d6260402 393File::KGlob module (available from CPAN) gives more portable glob
575cc754 394functionality.
68dc0745 395
396Within Perl, you may use this directly:
397
398 $filename =~ s{
399 ^ ~ # find a leading tilde
400 ( # save this in $1
401 [^/] # a non-slash character
402 * # repeated 0 or more times (0 means me)
403 )
404 }{
405 $1
406 ? (getpwnam($1))[7]
407 : ( $ENV{HOME} || $ENV{LOGDIR} )
408 }ex;
409
5a964f20 410=head2 How come when I open a file read-write it wipes it out?
d74e8afc 411X<clobber> X<read-write> X<clobbering> X<truncate> X<truncating>
68dc0745 412
413Because you're using something like this, which truncates the file and
414I<then> gives you read-write access:
415
5a964f20 416 open(FH, "+> /path/name"); # WRONG (almost always)
68dc0745 417
418Whoops. You should instead use this, which will fail if the file
197aec24 419doesn't exist.
d92eb7b0 420
421 open(FH, "+< /path/name"); # open for update
422
c47ff5f1 423Using ">" always clobbers or creates. Using "<" never does
d92eb7b0 424either. The "+" doesn't change this.
68dc0745 425
5a964f20 426Here are examples of many kinds of file opens. Those using sysopen()
427all assume
68dc0745 428
5a964f20 429 use Fcntl;
68dc0745 430
5a964f20 431To open file for reading:
68dc0745 432
5a964f20 433 open(FH, "< $path") || die $!;
434 sysopen(FH, $path, O_RDONLY) || die $!;
435
436To open file for writing, create new file if needed or else truncate old file:
437
438 open(FH, "> $path") || die $!;
439 sysopen(FH, $path, O_WRONLY|O_TRUNC|O_CREAT) || die $!;
440 sysopen(FH, $path, O_WRONLY|O_TRUNC|O_CREAT, 0666) || die $!;
441
442To open file for writing, create new file, file must not exist:
443
444 sysopen(FH, $path, O_WRONLY|O_EXCL|O_CREAT) || die $!;
445 sysopen(FH, $path, O_WRONLY|O_EXCL|O_CREAT, 0666) || die $!;
446
447To open file for appending, create if necessary:
448
449 open(FH, ">> $path") || die $!;
450 sysopen(FH, $path, O_WRONLY|O_APPEND|O_CREAT) || die $!;
451 sysopen(FH, $path, O_WRONLY|O_APPEND|O_CREAT, 0666) || die $!;
452
453To open file for appending, file must exist:
454
455 sysopen(FH, $path, O_WRONLY|O_APPEND) || die $!;
456
457To open file for update, file must exist:
458
459 open(FH, "+< $path") || die $!;
460 sysopen(FH, $path, O_RDWR) || die $!;
461
462To open file for update, create file if necessary:
463
464 sysopen(FH, $path, O_RDWR|O_CREAT) || die $!;
465 sysopen(FH, $path, O_RDWR|O_CREAT, 0666) || die $!;
466
467To open file for update, file must not exist:
468
469 sysopen(FH, $path, O_RDWR|O_EXCL|O_CREAT) || die $!;
470 sysopen(FH, $path, O_RDWR|O_EXCL|O_CREAT, 0666) || die $!;
471
472To open a file without blocking, creating if necessary:
473
2359510d 474 sysopen(FH, "/foo/somefile", O_WRONLY|O_NDELAY|O_CREAT)
475 or die "can't open /foo/somefile: $!":
5a964f20 476
477Be warned that neither creation nor deletion of files is guaranteed to
478be an atomic operation over NFS. That is, two processes might both
a6dd486b 479successfully create or unlink the same file! Therefore O_EXCL
480isn't as exclusive as you might wish.
68dc0745 481
87275199 482See also the new L<perlopentut> if you have it (new for 5.6).
65acb1b1 483
04d666b1 484=head2 Why do I sometimes get an "Argument list too long" when I use E<lt>*E<gt>?
d74e8afc 485X<argument list too long>
68dc0745 486
c47ff5f1 487The C<< <> >> operator performs a globbing operation (see above).
3a4b19e4 488In Perl versions earlier than v5.6.0, the internal glob() operator forks
489csh(1) to do the actual glob expansion, but
68dc0745 490csh can't handle more than 127 items and so gives the error message
491C<Argument list too long>. People who installed tcsh as csh won't
492have this problem, but their users may be surprised by it.
493
3a4b19e4 494To get around this, either upgrade to Perl v5.6.0 or later, do the glob
d6260402 495yourself with readdir() and patterns, or use a module like File::KGlob,
3a4b19e4 496one that doesn't use the shell to do globbing.
68dc0745 497
498=head2 Is there a leak/bug in glob()?
d74e8afc 499X<glob>
68dc0745 500
501Due to the current implementation on some operating systems, when you
502use the glob() function or its angle-bracket alias in a scalar
a6dd486b 503context, you may cause a memory leak and/or unpredictable behavior. It's
68dc0745 504best therefore to use glob() only in list context.
505
c47ff5f1 506=head2 How can I open a file with a leading ">" or trailing blanks?
d74e8afc 507X<filename, special characters>
68dc0745 508
b68463f7 509(contributed by Brian McCauley)
68dc0745 510
b68463f7 511The special two argument form of Perl's open() function ignores
512trailing blanks in filenames and infers the mode from certain leading
513characters (or a trailing "|"). In older versions of Perl this was the
514only version of open() and so it is prevalent in old code and books.
65acb1b1 515
b68463f7 516Unless you have a particular reason to use the two argument form you
517should use the three argument form of open() which does not treat any
518charcters in the filename as special.
519
881bdbd4 520 open FILE, "<", " file "; # filename is " file "
521 open FILE, ">", ">file"; # filename is ">file"
65acb1b1 522
68dc0745 523=head2 How can I reliably rename a file?
d74e8afc 524X<rename> X<mv> X<move> X<file, rename> X<ren>
68dc0745 525
49d635f9 526If your operating system supports a proper mv(1) utility or its
527functional equivalent, this works:
68dc0745 528
529 rename($old, $new) or system("mv", $old, $new);
530
d2321c93 531It may be more portable to use the File::Copy module instead.
532You just copy to the new file to the new name (checking return
533values), then delete the old one. This isn't really the same
534semantically as a rename(), which preserves meta-information like
68dc0745 535permissions, timestamps, inode info, etc.
536
d2321c93 537Newer versions of File::Copy export a move() function.
5a964f20 538
68dc0745 539=head2 How can I lock a file?
d74e8afc 540X<lock> X<file, lock> X<flock>
68dc0745 541
54310121 542Perl's builtin flock() function (see L<perlfunc> for details) will call
68dc0745 543flock(2) if that exists, fcntl(2) if it doesn't (on perl version 5.004 and
544later), and lockf(3) if neither of the two previous system calls exists.
545On some systems, it may even use a different form of native locking.
546Here are some gotchas with Perl's flock():
547
548=over 4
549
550=item 1
551
552Produces a fatal error if none of the three system calls (or their
553close equivalent) exists.
554
555=item 2
556
557lockf(3) does not provide shared locking, and requires that the
558filehandle be open for writing (or appending, or read/writing).
559
560=item 3
561
d92eb7b0 562Some versions of flock() can't lock files over a network (e.g. on NFS file
563systems), so you'd need to force the use of fcntl(2) when you build Perl.
a6dd486b 564But even this is dubious at best. See the flock entry of L<perlfunc>
d92eb7b0 565and the F<INSTALL> file in the source distribution for information on
566building Perl to do this.
567
568Two potentially non-obvious but traditional flock semantics are that
a6dd486b 569it waits indefinitely until the lock is granted, and that its locks are
d92eb7b0 570I<merely advisory>. Such discretionary locks are more flexible, but
571offer fewer guarantees. This means that files locked with flock() may
572be modified by programs that do not also use flock(). Cars that stop
573for red lights get on well with each other, but not with cars that don't
574stop for red lights. See the perlport manpage, your port's specific
575documentation, or your system-specific local manpages for details. It's
576best to assume traditional behavior if you're writing portable programs.
a6dd486b 577(If you're not, you should as always feel perfectly free to write
d92eb7b0 578for your own system's idiosyncrasies (sometimes called "features").
579Slavish adherence to portability concerns shouldn't get in the way of
580your getting your job done.)
68dc0745 581
197aec24 582For more information on file locking, see also
13a2d996 583L<perlopentut/"File Locking"> if you have it (new for 5.6).
65acb1b1 584
68dc0745 585=back
586
04d666b1 587=head2 Why can't I just open(FH, "E<gt>file.lock")?
d74e8afc 588X<lock, lockfile race condition>
68dc0745 589
590A common bit of code B<NOT TO USE> is this:
591
592 sleep(3) while -e "file.lock"; # PLEASE DO NOT USE
593 open(LCK, "> file.lock"); # THIS BROKEN CODE
594
595This is a classic race condition: you take two steps to do something
596which must be done in one. That's why computer hardware provides an
597atomic test-and-set instruction. In theory, this "ought" to work:
598
5a964f20 599 sysopen(FH, "file.lock", O_WRONLY|O_EXCL|O_CREAT)
9b55d3ab 600 or die "can't open file.lock: $!";
68dc0745 601
602except that lamentably, file creation (and deletion) is not atomic
603over NFS, so this won't work (at least, not every time) over the net.
65acb1b1 604Various schemes involving link() have been suggested, but
46fc3d4c 605these tend to involve busy-wait, which is also subdesirable.
68dc0745 606
fc36a67e 607=head2 I still don't get locking. I just want to increment the number in the file. How can I do this?
d74e8afc 608X<counter> X<file, counter>
68dc0745 609
46fc3d4c 610Didn't anyone ever tell you web-page hit counters were useless?
5a964f20 611They don't count number of hits, they're a waste of time, and they serve
a6dd486b 612only to stroke the writer's vanity. It's better to pick a random number;
613they're more realistic.
68dc0745 614
5a964f20 615Anyway, this is what you can do if you can't help yourself.
68dc0745 616
e2c57c3e 617 use Fcntl qw(:DEFAULT :flock);
5a964f20 618 sysopen(FH, "numfile", O_RDWR|O_CREAT) or die "can't open numfile: $!";
65acb1b1 619 flock(FH, LOCK_EX) or die "can't flock numfile: $!";
68dc0745 620 $num = <FH> || 0;
621 seek(FH, 0, 0) or die "can't rewind numfile: $!";
622 truncate(FH, 0) or die "can't truncate numfile: $!";
623 (print FH $num+1, "\n") or die "can't write numfile: $!";
68dc0745 624 close FH or die "can't close numfile: $!";
625
46fc3d4c 626Here's a much better web-page hit counter:
68dc0745 627
628 $hits = int( (time() - 850_000_000) / rand(1_000) );
629
630If the count doesn't impress your friends, then the code might. :-)
631
f52f3be2 632=head2 All I want to do is append a small amount of text to the end of a file. Do I still have to use locking?
d74e8afc 633X<append> X<file, append>
05caf3a7 634
635If you are on a system that correctly implements flock() and you use the
636example appending code from "perldoc -f flock" everything will be OK
637even if the OS you are on doesn't implement append mode correctly (if
638such a system exists.) So if you are happy to restrict yourself to OSs
639that implement flock() (and that's not really much of a restriction)
640then that is what you should do.
641
642If you know you are only going to use a system that does correctly
643implement appending (i.e. not Win32) then you can omit the seek() from
644the above code.
645
646If you know you are only writing code to run on an OS and filesystem that
647does implement append mode correctly (a local filesystem on a modern
648Unix for example), and you keep the file in block-buffered mode and you
649write less than one buffer-full of output between each manual flushing
8305e449 650of the buffer then each bufferload is almost guaranteed to be written to
05caf3a7 651the end of the file in one chunk without getting intermingled with
652anyone else's output. You can also use the syswrite() function which is
653simply a wrapper around your systems write(2) system call.
654
655There is still a small theoretical chance that a signal will interrupt
656the system level write() operation before completion. There is also a
657possibility that some STDIO implementations may call multiple system
658level write()s even if the buffer was empty to start. There may be some
659systems where this probability is reduced to zero.
660
68dc0745 661=head2 How do I randomly update a binary file?
d74e8afc 662X<file, binary patch>
68dc0745 663
664If you're just trying to patch a binary, in many cases something as
665simple as this works:
666
667 perl -i -pe 's{window manager}{window mangler}g' /usr/bin/emacs
668
669However, if you have fixed sized records, then you might do something more
670like this:
671
672 $RECSIZE = 220; # size of record, in bytes
673 $recno = 37; # which record to update
674 open(FH, "+<somewhere") || die "can't update somewhere: $!";
675 seek(FH, $recno * $RECSIZE, 0);
676 read(FH, $record, $RECSIZE) == $RECSIZE || die "can't read record $recno: $!";
677 # munge the record
65acb1b1 678 seek(FH, -$RECSIZE, 1);
68dc0745 679 print FH $record;
680 close FH;
681
682Locking and error checking are left as an exercise for the reader.
a6dd486b 683Don't forget them or you'll be quite sorry.
68dc0745 684
68dc0745 685=head2 How do I get a file's timestamp in perl?
d74e8afc 686X<timestamp> X<file, timestamp>
68dc0745 687
881bdbd4 688If you want to retrieve the time at which the file was last
689read, written, or had its meta-data (owner, etc) changed,
690you use the B<-M>, B<-A>, or B<-C> file test operations as
691documented in L<perlfunc>. These retrieve the age of the
692file (measured against the start-time of your program) in
693days as a floating point number. Some platforms may not have
694all of these times. See L<perlport> for details. To
695retrieve the "raw" time in seconds since the epoch, you
696would call the stat function, then use localtime(),
697gmtime(), or POSIX::strftime() to convert this into
698human-readable form.
68dc0745 699
700Here's an example:
701
702 $write_secs = (stat($file))[9];
c8db1d39 703 printf "file %s updated at %s\n", $file,
704 scalar localtime($write_secs);
68dc0745 705
706If you prefer something more legible, use the File::stat module
707(part of the standard distribution in version 5.004 and later):
708
65acb1b1 709 # error checking left as an exercise for reader.
68dc0745 710 use File::stat;
711 use Time::localtime;
712 $date_string = ctime(stat($file)->mtime);
713 print "file $file updated at $date_string\n";
714
65acb1b1 715The POSIX::strftime() approach has the benefit of being,
716in theory, independent of the current locale. See L<perllocale>
717for details.
68dc0745 718
719=head2 How do I set a file's timestamp in perl?
d74e8afc 720X<timestamp> X<file, timestamp>
68dc0745 721
722You use the utime() function documented in L<perlfunc/utime>.
723By way of example, here's a little program that copies the
724read and write times from its first argument to all the rest
725of them.
726
727 if (@ARGV < 2) {
728 die "usage: cptimes timestamp_file other_files ...\n";
729 }
730 $timestamp = shift;
731 ($atime, $mtime) = (stat($timestamp))[8,9];
732 utime $atime, $mtime, @ARGV;
733
65acb1b1 734Error checking is, as usual, left as an exercise for the reader.
68dc0745 735
19a1cd16 736The perldoc for utime also has an example that has the same
737effect as touch(1) on files that I<already exist>.
738
739Certain file systems have a limited ability to store the times
740on a file at the expected level of precision. For example, the
741FAT and HPFS filesystem are unable to create dates on files with
742a finer granularity than two seconds. This is a limitation of
743the filesystems, not of utime().
68dc0745 744
745=head2 How do I print to more than one file at once?
d74e8afc 746X<print, to multiple files>
68dc0745 747
49d635f9 748To connect one filehandle to several output filehandles,
749you can use the IO::Tee or Tie::FileHandle::Multiplex modules.
68dc0745 750
49d635f9 751If you only have to do this once, you can print individually
752to each filehandle.
68dc0745 753
49d635f9 754 for $fh (FH1, FH2, FH3) { print $fh "whatever\n" }
5a964f20 755
49d635f9 756=head2 How can I read in an entire file all at once?
d74e8afc 757X<slurp> X<file, slurping>
68dc0745 758
49d635f9 759You can use the File::Slurp module to do it in one step.
68dc0745 760
49d635f9 761 use File::Slurp;
197aec24 762
49d635f9 763 $all_of_it = read_file($filename); # entire file in scalar
764 @all_lines = read_file($filename); # one line perl element
d92eb7b0 765
766The customary Perl approach for processing all the lines in a file is to
767do so one line at a time:
768
769 open (INPUT, $file) || die "can't open $file: $!";
770 while (<INPUT>) {
771 chomp;
772 # do something with $_
197aec24 773 }
d92eb7b0 774 close(INPUT) || die "can't close $file: $!";
775
776This is tremendously more efficient than reading the entire file into
777memory as an array of lines and then processing it one element at a time,
a6dd486b 778which is often--if not almost always--the wrong approach. Whenever
d92eb7b0 779you see someone do this:
780
781 @lines = <INPUT>;
782
30852c57 783you should think long and hard about why you need everything loaded at
784once. It's just not a scalable solution. You might also find it more
785fun to use the standard Tie::File module, or the DB_File module's
786$DB_RECNO bindings, which allow you to tie an array to a file so that
787accessing an element the array actually accesses the corresponding
788line in the file.
d92eb7b0 789
f05bbc40 790You can read the entire filehandle contents into a scalar.
d92eb7b0 791
792 {
793 local(*INPUT, $/);
794 open (INPUT, $file) || die "can't open $file: $!";
795 $var = <INPUT>;
796 }
797
197aec24 798That temporarily undefs your record separator, and will automatically
d92eb7b0 799close the file at block exit. If the file is already open, just use this:
800
801 $var = do { local $/; <INPUT> };
802
f05bbc40 803For ordinary files you can also use the read function.
804
805 read( INPUT, $var, -s INPUT );
806
807The third argument tests the byte size of the data on the INPUT filehandle
808and reads that many bytes into the buffer $var.
809
68dc0745 810=head2 How can I read in a file by paragraphs?
d74e8afc 811X<file, reading by paragraphs>
68dc0745 812
65acb1b1 813Use the C<$/> variable (see L<perlvar> for details). You can either
68dc0745 814set it to C<""> to eliminate empty paragraphs (C<"abc\n\n\n\ndef">,
815for instance, gets treated as two paragraphs and not three), or
816C<"\n\n"> to accept empty paragraphs.
817
197aec24 818Note that a blank line must have no blanks in it. Thus
c4db748a 819S<C<"fred\n \nstuff\n\n">> is one paragraph, but C<"fred\n\nstuff\n\n"> is two.
65acb1b1 820
68dc0745 821=head2 How can I read a single character from a file? From the keyboard?
d74e8afc 822X<getc> X<file, reading one character at a time>
68dc0745 823
824You can use the builtin C<getc()> function for most filehandles, but
825it won't (easily) work on a terminal device. For STDIN, either use
a6dd486b 826the Term::ReadKey module from CPAN or use the sample code in
68dc0745 827L<perlfunc/getc>.
828
65acb1b1 829If your system supports the portable operating system programming
830interface (POSIX), you can use the following code, which you'll note
831turns off echo processing as well.
68dc0745 832
833 #!/usr/bin/perl -w
834 use strict;
835 $| = 1;
836 for (1..4) {
837 my $got;
838 print "gimme: ";
839 $got = getone();
840 print "--> $got\n";
841 }
842 exit;
843
844 BEGIN {
845 use POSIX qw(:termios_h);
846
847 my ($term, $oterm, $echo, $noecho, $fd_stdin);
848
849 $fd_stdin = fileno(STDIN);
850
851 $term = POSIX::Termios->new();
852 $term->getattr($fd_stdin);
853 $oterm = $term->getlflag();
854
855 $echo = ECHO | ECHOK | ICANON;
856 $noecho = $oterm & ~$echo;
857
858 sub cbreak {
859 $term->setlflag($noecho);
860 $term->setcc(VTIME, 1);
861 $term->setattr($fd_stdin, TCSANOW);
862 }
863
864 sub cooked {
865 $term->setlflag($oterm);
866 $term->setcc(VTIME, 0);
867 $term->setattr($fd_stdin, TCSANOW);
868 }
869
870 sub getone {
871 my $key = '';
872 cbreak();
873 sysread(STDIN, $key, 1);
874 cooked();
875 return $key;
876 }
877
878 }
879
880 END { cooked() }
881
a6dd486b 882The Term::ReadKey module from CPAN may be easier to use. Recent versions
65acb1b1 883include also support for non-portable systems as well.
68dc0745 884
885 use Term::ReadKey;
886 open(TTY, "</dev/tty");
887 print "Gimme a char: ";
888 ReadMode "raw";
889 $key = ReadKey 0, *TTY;
890 ReadMode "normal";
891 printf "\nYou said %s, char number %03d\n",
892 $key, ord $key;
893
65acb1b1 894=head2 How can I tell whether there's a character waiting on a filehandle?
68dc0745 895
5a964f20 896The very first thing you should do is look into getting the Term::ReadKey
65acb1b1 897extension from CPAN. As we mentioned earlier, it now even has limited
898support for non-portable (read: not open systems, closed, proprietary,
899not POSIX, not Unix, etc) systems.
5a964f20 900
901You should also check out the Frequently Asked Questions list in
68dc0745 902comp.unix.* for things like this: the answer is essentially the same.
903It's very system dependent. Here's one solution that works on BSD
904systems:
905
906 sub key_ready {
907 my($rin, $nfd);
908 vec($rin, fileno(STDIN), 1) = 1;
909 return $nfd = select($rin,undef,undef,0);
910 }
911
65acb1b1 912If you want to find out how many characters are waiting, there's
913also the FIONREAD ioctl call to be looked at. The I<h2ph> tool that
914comes with Perl tries to convert C include files to Perl code, which
915can be C<require>d. FIONREAD ends up defined as a function in the
916I<sys/ioctl.ph> file:
68dc0745 917
5a964f20 918 require 'sys/ioctl.ph';
68dc0745 919
5a964f20 920 $size = pack("L", 0);
921 ioctl(FH, FIONREAD(), $size) or die "Couldn't call ioctl: $!\n";
922 $size = unpack("L", $size);
68dc0745 923
5a964f20 924If I<h2ph> wasn't installed or doesn't work for you, you can
925I<grep> the include files by hand:
68dc0745 926
5a964f20 927 % grep FIONREAD /usr/include/*/*
928 /usr/include/asm/ioctls.h:#define FIONREAD 0x541B
68dc0745 929
5a964f20 930Or write a small C program using the editor of champions:
68dc0745 931
5a964f20 932 % cat > fionread.c
933 #include <sys/ioctl.h>
934 main() {
935 printf("%#08x\n", FIONREAD);
936 }
937 ^D
65acb1b1 938 % cc -o fionread fionread.c
5a964f20 939 % ./fionread
940 0x4004667f
941
8305e449 942And then hard code it, leaving porting as an exercise to your successor.
5a964f20 943
944 $FIONREAD = 0x4004667f; # XXX: opsys dependent
945
946 $size = pack("L", 0);
947 ioctl(FH, $FIONREAD, $size) or die "Couldn't call ioctl: $!\n";
948 $size = unpack("L", $size);
949
a6dd486b 950FIONREAD requires a filehandle connected to a stream, meaning that sockets,
5a964f20 951pipes, and tty devices work, but I<not> files.
68dc0745 952
953=head2 How do I do a C<tail -f> in perl?
d74e8afc 954X<tail>
68dc0745 955
956First try
957
958 seek(GWFILE, 0, 1);
959
960The statement C<seek(GWFILE, 0, 1)> doesn't change the current position,
961but it does clear the end-of-file condition on the handle, so that the
962next <GWFILE> makes Perl try again to read something.
963
964If that doesn't work (it relies on features of your stdio implementation),
965then you need something more like this:
966
967 for (;;) {
968 for ($curpos = tell(GWFILE); <GWFILE>; $curpos = tell(GWFILE)) {
969 # search for some stuff and put it into files
970 }
971 # sleep for a while
972 seek(GWFILE, $curpos, 0); # seek to where we had been
973 }
974
975If this still doesn't work, look into the POSIX module. POSIX defines
976the clearerr() method, which can remove the end of file condition on a
977filehandle. The method: read until end of file, clearerr(), read some
978more. Lather, rinse, repeat.
979
65acb1b1 980There's also a File::Tail module from CPAN.
981
68dc0745 982=head2 How do I dup() a filehandle in Perl?
d74e8afc 983X<dup>
68dc0745 984
985If you check L<perlfunc/open>, you'll see that several of the ways
986to call open() should do the trick. For example:
987
2359510d 988 open(LOG, ">>/foo/logfile");
68dc0745 989 open(STDERR, ">&LOG");
990
991Or even with a literal numeric descriptor:
992
993 $fd = $ENV{MHCONTEXTFD};
994 open(MHCONTEXT, "<&=$fd"); # like fdopen(3S)
995
c47ff5f1 996Note that "<&STDIN" makes a copy, but "<&=STDIN" make
5a964f20 997an alias. That means if you close an aliased handle, all
197aec24 998aliases become inaccessible. This is not true with
5a964f20 999a copied one.
1000
1001Error checking, as always, has been left as an exercise for the reader.
68dc0745 1002
1003=head2 How do I close a file descriptor by number?
d74e8afc 1004X<file, closing file descriptors>
68dc0745 1005
1006This should rarely be necessary, as the Perl close() function is to be
1007used for things that Perl opened itself, even if it was a dup of a
a6dd486b 1008numeric descriptor as with MHCONTEXT above. But if you really have
68dc0745 1009to, you may be able to do this:
1010
1011 require 'sys/syscall.ph';
1012 $rc = syscall(&SYS_close, $fd + 0); # must force numeric
1013 die "can't sysclose $fd: $!" unless $rc == -1;
1014
a6dd486b 1015Or, just use the fdopen(3S) feature of open():
d92eb7b0 1016
197aec24 1017 {
1018 local *F;
d92eb7b0 1019 open F, "<&=$fd" or die "Cannot reopen fd=$fd: $!";
1020 close F;
1021 }
1022
883f1635 1023=head2 Why can't I use "C:\temp\foo" in DOS paths? Why doesn't `C:\temp\foo.exe` work?
d74e8afc 1024X<filename, DOS issues>
68dc0745 1025
1026Whoops! You just put a tab and a formfeed into that filename!
1027Remember that within double quoted strings ("like\this"), the
1028backslash is an escape character. The full list of these is in
1029L<perlop/Quote and Quote-like Operators>. Unsurprisingly, you don't
1030have a file called "c:(tab)emp(formfeed)oo" or
65acb1b1 1031"c:(tab)emp(formfeed)oo.exe" on your legacy DOS filesystem.
68dc0745 1032
1033Either single-quote your strings, or (preferably) use forward slashes.
46fc3d4c 1034Since all DOS and Windows versions since something like MS-DOS 2.0 or so
68dc0745 1035have treated C</> and C<\> the same in a path, you might as well use the
a6dd486b 1036one that doesn't clash with Perl--or the POSIX shell, ANSI C and C++,
65acb1b1 1037awk, Tcl, Java, or Python, just to mention a few. POSIX paths
1038are more portable, too.
68dc0745 1039
1040=head2 Why doesn't glob("*.*") get all the files?
d74e8afc 1041X<glob>
68dc0745 1042
1043Because even on non-Unix ports, Perl's glob function follows standard
46fc3d4c 1044Unix globbing semantics. You'll need C<glob("*")> to get all (non-hidden)
65acb1b1 1045files. This makes glob() portable even to legacy systems. Your
1046port may include proprietary globbing functions as well. Check its
1047documentation for details.
68dc0745 1048
1049=head2 Why does Perl let me delete read-only files? Why does C<-i> clobber protected files? Isn't this a bug in Perl?
1050
06a5f41f 1051This is elaborately and painstakingly described in the
1052F<file-dir-perms> article in the "Far More Than You Ever Wanted To
49d635f9 1053Know" collection in http://www.cpan.org/misc/olddoc/FMTEYEWTK.tgz .
68dc0745 1054
1055The executive summary: learn how your filesystem works. The
1056permissions on a file say what can happen to the data in that file.
1057The permissions on a directory say what can happen to the list of
1058files in that directory. If you delete a file, you're removing its
1059name from the directory (so the operation depends on the permissions
1060of the directory, not of the file). If you try to write to the file,
1061the permissions of the file govern whether you're allowed to.
1062
1063=head2 How do I select a random line from a file?
d74e8afc 1064X<file, selecting a random line>
68dc0745 1065
1066Here's an algorithm from the Camel Book:
1067
1068 srand;
1069 rand($.) < 1 && ($line = $_) while <>;
1070
49d635f9 1071This has a significant advantage in space over reading the whole file
1072in. You can find a proof of this method in I<The Art of Computer
1073Programming>, Volume 2, Section 3.4.2, by Donald E. Knuth.
1074
1075You can use the File::Random module which provides a function
1076for that algorithm:
1077
1078 use File::Random qw/random_line/;
1079 my $line = random_line($filename);
1080
1081Another way is to use the Tie::File module, which treats the entire
1082file as an array. Simply access a random array element.
68dc0745 1083
65acb1b1 1084=head2 Why do I get weird spaces when I print an array of lines?
1085
1086Saying
1087
1088 print "@lines\n";
1089
1090joins together the elements of C<@lines> with a space between them.
1091If C<@lines> were C<("little", "fluffy", "clouds")> then the above
a6dd486b 1092statement would print
65acb1b1 1093
1094 little fluffy clouds
1095
1096but if each element of C<@lines> was a line of text, ending a newline
1097character C<("little\n", "fluffy\n", "clouds\n")> then it would print:
1098
1099 little
1100 fluffy
1101 clouds
1102
1103If your array contains lines, just print them:
1104
1105 print @lines;
1106
68dc0745 1107=head1 AUTHOR AND COPYRIGHT
1108
7678cced 1109Copyright (c) 1997-2005 Tom Christiansen, Nathan Torkington, and
1110other authors as noted. All rights reserved.
5a964f20 1111
5a7beb56 1112This documentation is free; you can redistribute it and/or modify it
1113under the same terms as Perl itself.
c8db1d39 1114
87275199 1115Irrespective of its distribution, all code examples here are in the public
c8db1d39 1116domain. You are permitted and encouraged to use this code and any
1117derivatives thereof in your own programs for fun or for profit as you
1118see fit. A simple comment in the code giving credit to the FAQ would
1119be courteous but is not required.