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