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