source: for-distributions/trunk/bin/windows/perl/lib/Pod/perlfaq5.pod@ 14489

Last change on this file since 14489 was 14489, checked in by oranfry, 17 years ago

upgrading to perl 5.8

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