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