FAQ jumbo patch from tchrist.
Tom Christiansen [Thu, 7 Jan 1999 23:05:02 +0000 (16:05 -0700)]
Message-Id: <199901080605.XAA20229@jhereg.perl.com>
To: pumpkings@jhereg.perl.com
Subject: newest version of perlfaq.pod
Date: Thu, 7 Jan 1999 23:05:02 -0700

Message-Id: <199901080605.XAA20231@jhereg.perl.com>
From: Tom Christiansen <tchrist@jhereg.perl.com>
To: pumpkings@jhereg.perl.com
Subject: newest version of perlfaq1.pod
Date: Thu, 7 Jan 1999 23:05:02 -0700

Message-Id: <199901080605.XAA20233@jhereg.perl.com>
From: Tom Christiansen <tchrist@jhereg.perl.com>
To: pumpkings@jhereg.perl.com
Subject: newest version of perlfaq2.pod
Date: Thu, 7 Jan 1999 23:05:02 -0700

Message-Id: <199901080605.XAA20235@jhereg.perl.com>
From: Tom Christiansen <tchrist@jhereg.perl.com>
To: pumpkings@jhereg.perl.com
Subject: newest version of perlfaq3.pod
Date: Thu, 7 Jan 1999 23:05:02 -0700

Message-Id: <199901080605.XAA20237@jhereg.perl.com>
From: Tom Christiansen <tchrist@jhereg.perl.com>
To: pumpkings@jhereg.perl.com
Subject: newest version of perlfaq4.pod
Date: Thu, 7 Jan 1999 23:05:02 -0700

Message-Id: <199901080605.XAA20239@jhereg.perl.com>
From: Tom Christiansen <tchrist@jhereg.perl.com>
To: pumpkings@jhereg.perl.com
Subject: newest version of perlfaq5.pod
Date: Thu, 7 Jan 1999 23:05:02 -0700

Message-Id: <199901080605.XAA20241@jhereg.perl.com>
From: Tom Christiansen <tchrist@jhereg.perl.com>
To: pumpkings@jhereg.perl.com
Subject: newest version of perlfaq6.pod
Date: Thu, 7 Jan 1999 23:05:02 -0700

Message-Id: <199901080605.XAA20243@jhereg.perl.com>
From: Tom Christiansen <tchrist@jhereg.perl.com>
To: pumpkings@jhereg.perl.com
Subject: newest version of perlfaq7.pod
Date: Thu, 7 Jan 1999 23:05:03 -0700

Message-Id: <199901080605.XAA20245@jhereg.perl.com>
From: Tom Christiansen <tchrist@jhereg.perl.com>
To: pumpkings@jhereg.perl.com
Subject: newest version of perlfaq8.pod
Date: Thu, 7 Jan 1999 23:05:03 -0700

Message-Id: <199901080605.XAA20257@jhereg.perl.com>
From: Tom Christiansen <tchrist@jhereg.perl.com>
To: pumpkings@jhereg.perl.com
Subject: newest version of perlfaq9.pod
Date: Thu, 7 Jan 1999 23:05:03 -0700

p4raw-id: //depot/cfgperl@2588

pod/perlfaq.pod
pod/perlfaq1.pod
pod/perlfaq2.pod
pod/perlfaq3.pod
pod/perlfaq4.pod
pod/perlfaq5.pod
pod/perlfaq6.pod
pod/perlfaq7.pod
pod/perlfaq8.pod
pod/perlfaq9.pod

index e6be112..cb35493 100644 (file)
@@ -1,6 +1,6 @@
 =head1 NAME
 
-perlfaq - frequently asked questions about Perl ($Date: 1998/08/05 12:09:32 $)
+perlfaq - frequently asked questions about Perl ($Date: 1999/01/08 05:54:52 $)
 
 =head1 DESCRIPTION
 
@@ -16,42 +16,682 @@ This document.
 
 Very general, high-level information about Perl.
 
+=over 4
+
+=item * What is Perl?
+
+=item * Who supports Perl?  Who develops it?  Why is it free?
+
+=item * Which version of Perl should I use?
+
+=item * What are perl4 and perl5?
+
+=item * What is perl6?
+
+=item * How stable is Perl?
+
+=item * Is Perl difficult to learn?
+
+=item * How does Perl compare with other languages like Java, Python, REXX, Scheme, or Tcl?
+
+=item * Can I do [task] in Perl?
+
+=item * When shouldn't I program in Perl?
+
+=item * What's the difference between "perl" and "Perl"?
+
+=item * Is it a Perl program or a Perl script?
+
+=item * What is a JAPH?
+
+=item * Where can I get a list of Larry Wall witticisms?
+
+=item * How can I convince my sysadmin/supervisor/employees to use version (5/5.005/Perl instead of some other language)?
+
+=back
+
+
 =item L<perlfaq2>: Obtaining and Learning about Perl
 
 Where to find source and documentation to Perl, support,
 and related matters.
 
+=over 4
+
+=item * What machines support Perl?  Where do I get it?
+
+=item * How can I get a binary version of Perl?
+
+=item * I don't have a C compiler on my system.  How can I compile perl?
+
+=item * I copied the Perl binary from one machine to another, but scripts don't work.
+
+=item * I grabbed the sources and tried to compile but gdbm/dynamic loading/malloc/linking/... failed.  How do I make it work?
+
+=item * What modules and extensions are available for Perl?  What is CPAN?  What does CPAN/src/... mean?
+
+=item * Is there an ISO or ANSI certified version of Perl?
+
+=item * Where can I get information on Perl?
+
+=item * What are the Perl newsgroups on USENET?  Where do I post questions?
+
+=item * Where should I post source code?
+
+=item * Perl Books
+
+=item * Perl in Magazines
+
+=item * Perl on the Net: FTP and WWW Access
+
+=item * What mailing lists are there for perl?
+
+=item * Archives of comp.lang.perl.misc
+
+=item * Where can I buy a commercial version of Perl?
+
+=item * Where do I send bug reports?
+
+=item * What is perl.com?  
+
+=back
+
+
 =item L<perlfaq3>: Programming Tools
 
 Programmer tools and programming support.
 
+=over 4
+
+=item * How do I do (anything)?
+
+=item * How can I use Perl interactively?
+
+=item * Is there a Perl shell?
+
+=item * How do I debug my Perl programs?
+
+=item * How do I profile my Perl programs?
+
+=item * How do I cross-reference my Perl programs?
+
+=item * Is there a pretty-printer (formatter) for Perl?
+
+=item * Is there a ctags for Perl?
+
+=item * Is there an IDE or Windows Perl Editor?
+
+=item * Where can I get Perl macros for vi?
+
+=item * Where can I get perl-mode for emacs?
+
+=item * How can I use curses with Perl?
+
+=item * How can I use X or Tk with Perl?
+
+=item * How can I generate simple menus without using CGI or Tk?
+
+=item * What is undump?
+
+=item * How can I make my Perl program run faster?
+
+=item * How can I make my Perl program take less memory?
+
+=item * Is it unsafe to return a pointer to local data?
+
+=item * How can I free an array or hash so my program shrinks?
+
+=item * How can I make my CGI script more efficient?
+
+=item * How can I hide the source for my Perl program?
+
+=item * How can I compile my Perl program into byte code or C?
+
+=item * How can I compile Perl into Java?
+
+=item * How can I get C<#!perl> to work on [MS-DOS,NT,...]?
+
+=item * Can I write useful perl programs on the command line?
+
+=item * Why don't perl one-liners work on my DOS/Mac/VMS system?
+
+=item * Where can I learn about CGI or Web programming in Perl?
+
+=item * Where can I learn about object-oriented Perl programming?
+
+=item * Where can I learn about linking C with Perl? [h2xs, xsubpp]
+
+=item * I've read perlembed, perlguts, etc., but I can't embed perl in
+my C program, what am I doing wrong?
+
+=item * When I tried to run my script, I got this message. What does it
+mean?
+
+=item * What's MakeMaker?
+
+=back
+
+
 =item L<perlfaq4>: Data Manipulation
 
 Manipulating numbers, dates, strings, arrays, hashes, and
 miscellaneous data issues.
 
+=over 4
+
+=item * Why am I getting long decimals (eg, 19.9499999999999) instead of the numbers I should be getting (eg, 19.95)?
+
+=item * Why isn't my octal data interpreted correctly?
+
+=item * Does Perl have a round() function?  What about ceil() and floor()?  Trig functions?
+
+=item * How do I convert bits into ints?
+
+=item * Why doesn't & work the way I want it to?
+
+=item * How do I multiply matrices?
+
+=item * How do I perform an operation on a series of integers?
+
+=item * How can I output Roman numerals?
+
+=item * Why aren't my random numbers random?
+
+=item * How do I find the week-of-the-year/day-of-the-year?
+
+=item * How can I compare two dates and find the difference?
+
+=item * How can I take a string and turn it into epoch seconds?
+
+=item * How can I find the Julian Day?
+
+=item * How do I find yesterday's date?
+
+=item * Does Perl have a year 2000 problem?  Is Perl Y2K compliant?
+
+=item * How do I validate input?
+
+=item * How do I unescape a string?
+
+=item * How do I remove consecutive pairs of characters?
+
+=item * How do I expand function calls in a string?
+
+=item * How do I find matching/nesting anything?
+
+=item * How do I reverse a string?
+
+=item * How do I expand tabs in a string?
+
+=item * How do I reformat a paragraph?
+
+=item * How can I access/change the first N letters of a string?
+
+=item * How do I change the Nth occurrence of something?
+
+=item * How can I count the number of occurrences of a substring within a string?
+
+=item * How do I capitalize all the words on one line?
+
+=item * How can I split a [character] delimited string except when inside
+[character]? (Comma-separated files)
+
+=item * How do I strip blank space from the beginning/end of a string?
+
+=item * How do I pad a string with blanks or pad a number with zeroes?
+
+=item * How do I extract selected columns from a string?
+
+=item * How do I find the soundex value of a string?
+
+=item * How can I expand variables in text strings?
+
+=item * What's wrong with always quoting "$vars"?
+
+=item * Why don't my E<lt>E<lt>HERE documents work?
+
+=item * What is the difference between a list and an array?
+
+=item * What is the difference between $array[1] and @array[1]?
+
+=item * How can I extract just the unique elements of an array?
+
+=item * How can I tell whether a list or array contains a certain element?
+
+=item * How do I compute the difference of two arrays?  How do I compute the intersection of two arrays?
+
+=item * How do I test whether two arrays or hashes are equal?
+
+=item * How do I find the first array element for which a condition is true?
+
+=item * How do I handle linked lists?
+
+=item * How do I handle circular lists?
+
+=item * How do I shuffle an array randomly?
+
+=item * How do I process/modify each element of an array?
+
+=item * How do I select a random element from an array?
+
+=item * How do I permute N elements of a list?
+
+=item * How do I sort an array by (anything)?
+
+=item * How do I manipulate arrays of bits?
+
+=item * Why does defined() return true on empty arrays and hashes?
+
+=item * How do I process an entire hash?
+
+=item * What happens if I add or remove keys from a hash while iterating over it?
+
+=item * How do I look up a hash element by value?
+
+=item * How can I know how many entries are in a hash?
+
+=item * How do I sort a hash (optionally by value instead of key)?
+
+=item * How can I always keep my hash sorted?
+
+=item * What's the difference between "delete" and "undef" with hashes?
+
+=item * Why don't my tied hashes make the defined/exists distinction?
+
+=item * How do I reset an each() operation part-way through?
+
+=item * How can I get the unique keys from two hashes?
+
+=item * How can I store a multidimensional array in a DBM file?
+
+=item * How can I make my hash remember the order I put elements into it?
+
+=item * Why does passing a subroutine an undefined element in a hash create it?
+
+=item * How can I make the Perl equivalent of a C structure/C++ class/hash or array of hashes or arrays?
+
+=item * How can I use a reference as a hash key?
+
+=item * How do I handle binary data correctly?
+
+=item * How do I determine whether a scalar is a number/whole/integer/float?
+
+=item * How do I keep persistent data across program calls?
+
+=item * How do I print out or copy a recursive data structure?
+
+=item * How do I define methods for every class/object?
+
+=item * How do I verify a credit card checksum?
+
+=item * How do I pack arrays of doubles or floats for XS code?
+
+=back
+
+
 =item L<perlfaq5>: Files and Formats
 
 I/O and the "f" issues: filehandles, flushing, formats and footers.
 
+=over 4
+
+=item * How do I flush/unbuffer an output filehandle?  Why must I do this?
+
+=item * 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?
+
+=item * How do I count the number of lines in a file?
+
+=item * How do I make a temporary file name?
+
+=item * How can I manipulate fixed-record-length files?
+
+=item * 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?
+
+=item * How can I use a filehandle indirectly?
+
+=item * How can I set up a footer format to be used with write()?
+
+=item * How can I write() into a string?
+
+=item * How can I output my numbers with commas added?
+
+=item * How can I translate tildes (~) in a filename?
+
+=item * How come when I open a file read-write it wipes it out?
+
+=item * Why do I sometimes get an "Argument list too long" when I use E<lt>*E<gt>?
+
+=item * Is there a leak/bug in glob()?
+
+=item * How can I open a file with a leading "E<gt>" or trailing blanks?
+
+=item * How can I reliably rename a file?
+
+=item * How can I lock a file?
+
+=item * Why can't I just open(FH, ">file.lock")?
+
+=item * I still don't get locking.  I just want to increment the number in the file.  How can I do this?
+
+=item * How do I randomly update a binary file?
+
+=item * How do I get a file's timestamp in perl?
+
+=item * How do I set a file's timestamp in perl?
+
+=item * How do I print to more than one file at once?
+
+=item * How can I read in a file by paragraphs?
+
+=item * How can I read a single character from a file?  From the keyboard?
+
+=item * How can I tell whether there's a character waiting on a filehandle?
+
+=item * How do I do a C<tail -f> in perl?
+
+=item * How do I dup() a filehandle in Perl?
+
+=item * How do I close a file descriptor by number?
+
+=item * Why can't I use "C:\temp\foo" in DOS paths?  What doesn't `C:\temp\foo.exe` work?
+
+=item * Why doesn't glob("*.*") get all the files?
+
+=item * Why does Perl let me delete read-only files?  Why does C<-i> clobber protected files?  Isn't this a bug in Perl?
+
+=item * How do I select a random line from a file?
+
+=item * Why do I get weird spaces when I print an array of lines?
+
+=back
+
+
 =item L<perlfaq6>: Regexps
 
 Pattern matching and regular expressions.
 
+=over 4
+
+=item * How can I hope to use regular expressions without creating illegible and unmaintainable code?
+
+=item * I'm having trouble matching over more than one line.  What's wrong?
+
+=item * How can I pull out lines between two patterns that are themselves on different lines?
+
+=item * I put a regular expression into $/ but it didn't work. What's wrong?
+
+=item * How do I substitute case insensitively on the LHS, but preserving case on the RHS?
+
+=item * How can I make C<\w> match national character sets?
+
+=item * How can I match a locale-smart version of C</[a-zA-Z]/>?
+
+=item * How can I quote a variable to use in a regexp?
+
+=item * What is C</o> really for?
+
+=item * How do I use a regular expression to strip C style comments from a file?
+
+=item * Can I use Perl regular expressions to match balanced text?
+
+=item * What does it mean that regexps are greedy?  How can I get around it?
+
+=item * How do I process each word on each line?
+
+=item * How can I print out a word-frequency or line-frequency summary?
+
+=item * How can I do approximate matching?
+
+=item * How do I efficiently match many regular expressions at once?
+
+=item * Why don't word-boundary searches with C<\b> work for me?
+
+=item * Why does using $&, $`, or $' slow my program down?
+
+=item * What good is C<\G> in a regular expression?
+
+=item * Are Perl regexps DFAs or NFAs?  Are they POSIX compliant?
+
+=item * What's wrong with using grep or map in a void context?
+
+=item * How can I match strings with multibyte characters?
+
+=item * How do I match a pattern that is supplied by the user?
+
+=back
+
+
 =item L<perlfaq7>: General Perl Language Issues
 
 General Perl language issues that don't clearly fit into any of the
 other sections.
 
+=over 4
+
+=item * Can I get a BNF/yacc/RE for the Perl language?
+
+=item * What are all these $@%* punctuation signs, and how do I know when to use them?
+
+=item * Do I always/never have to quote my strings or use semicolons and commas?
+
+=item * How do I skip some return values?
+
+=item * How do I temporarily block warnings?
+
+=item * What's an extension?
+
+=item * Why do Perl operators have different precedence than C operators?
+
+=item * How do I declare/create a structure?
+
+=item * How do I create a module?
+
+=item * How do I create a class?
+
+=item * How can I tell if a variable is tainted?
+
+=item * What's a closure?
+
+=item * What is variable suicide and how can I prevent it?
+
+=item * How can I pass/return a {Function, FileHandle, Array, Hash, Method, Regexp}?
+
+=item * How do I create a static variable?
+
+=item * What's the difference between dynamic and lexical (static) scoping?  Between local() and my()?
+
+=item * How can I access a dynamic variable while a similarly named lexical is in scope?
+
+=item * What's the difference between deep and shallow binding?
+
+=item * Why doesn't "my($foo) = E<lt>FILEE<gt>;" work right?
+
+=item * How do I redefine a builtin function, operator, or method?
+
+=item * What's the difference between calling a function as &foo and foo()?
+
+=item * How do I create a switch or case statement?
+
+=item * How can I catch accesses to undefined variables/functions/methods?
+
+=item * Why can't a method included in this same file be found?
+
+=item * How can I find out my current package?
+
+=item * How can I comment out a large block of perl code?
+
+=item * How do I clear a package?
+
+=back
+
+
 =item L<perlfaq8>: System Interaction
 
 Interprocess communication (IPC), control over the user-interface
 (keyboard, screen and pointing devices).
 
+=over 4
+
+=item * How do I find out which operating system I'm running under?
+
+=item * How come exec() doesn't return?
+
+=item * How do I do fancy stuff with the keyboard/screen/mouse?
+
+=item * How do I print something out in color?
+
+=item * How do I read just one key without waiting for a return key?
+
+=item * How do I check whether input is ready on the keyboard?
+
+=item * How do I clear the screen?
+
+=item * How do I get the screen size?
+
+=item * How do I ask the user for a password?
+
+=item * How do I read and write the serial port?
+
+=item * How do I decode encrypted password files?
+
+=item * How do I start a process in the background?
+
+=item * How do I trap control characters/signals?
+
+=item * How do I modify the shadow password file on a Unix system?
+
+=item * How do I set the time and date?
+
+=item * How can I sleep() or alarm() for under a second?
+
+=item * How can I measure time under a second?
+
+=item * How can I do an atexit() or setjmp()/longjmp()? (Exception handling)
+
+=item * Why doesn't my sockets program work under System V (Solaris)? What does the error message "Protocol not supported" mean?
+
+=item * How can I call my system's unique C functions from Perl?
+
+=item * Where do I get the include files to do ioctl() or syscall()?
+
+=item * Why do setuid perl scripts complain about kernel problems?
+
+=item * How can I open a pipe both to and from a command?
+
+=item * Why can't I get the output of a command with system()?
+
+=item * How can I capture STDERR from an external command?
+
+=item * Why doesn't open() return an error when a pipe open fails?
+
+=item * What's wrong with using backticks in a void context?
+
+=item * How can I call backticks without shell processing?
+
+=item * Why can't my script read from STDIN after I gave it EOF (^D on Unix, ^Z on MS-DOS)?
+
+=item * How can I convert my shell script to perl?
+
+=item * Can I use perl to run a telnet or ftp session?
+
+=item * How can I write expect in Perl?
+
+=item * Is there a way to hide perl's command line from programs such as "ps"?
+
+=item * I {changed directory, modified my environment} in a perl script.  How come the change disappeared when I exited the script?  How do I get my changes to be visible?
+
+=item * How do I close a process's filehandle without waiting for it to complete?
+
+=item * How do I fork a daemon process?
+
+=item * How do I make my program run with sh and csh?
+
+=item * How do I find out if I'm running interactively or not?
+
+=item * How do I timeout a slow event?
+
+=item * How do I set CPU limits?
+
+=item * How do I avoid zombies on a Unix system?
+
+=item * How do I use an SQL database?
+
+=item * How do I make a system() exit on control-C?
+
+=item * How do I open a file without blocking?
+
+=item * How do I install a CPAN module?
+
+=item * What's the difference between require and use?
+
+=item * How do I keep my own module/library directory?
+
+=item * How do I add the directory my program lives in to the module/library search path?
+
+=item * How do I add a directory to my include path at runtime?
+
+=item * What is socket.ph and where do I get it?
+
+=back
+
+
 =item L<perlfaq9>: Networking
 
 Networking, the Internet, and a few on the web.
 
+=over 4
+
+=item * My CGI script runs from the command line but not the browser.   (500 Server Error)
+
+=item * How can I get better error messages from a CGI program?
+
+=item * How do I remove HTML from a string?
+
+=item * How do I extract URLs?
+
+=item * How do I download a file from the user's machine?  How do I open a file on another machine?
+
+=item * How do I make a pop-up menu in HTML?
+
+=item * How do I fetch an HTML file?
+
+=item * How do I automate an HTML form submission?
+
+=item * How do I decode or create those %-encodings on the web?
+
+=item * How do I redirect to another page?
+
+=item * How do I put a password on my web pages?
+
+=item * How do I edit my .htpasswd and .htgroup files with Perl?
+
+=item * How do I make sure users can't enter values into a form that cause my CGI script to do bad things?
+
+=item * How do I parse a mail header?
+
+=item * How do I decode a CGI form?
+
+=item * How do I check a valid mail address?
+
+=item * How do I decode a MIME/BASE64 string?
+
+=item * How do I return the user's mail address?
+
+=item * How do I send mail?
+
+=item * How do I read mail?
+
+=item * How do I find out my hostname/domainname/IP address?
+
+=item * How do I fetch a news article or the active newsgroups?
+
+=item * How do I fetch/put an FTP file?
+
+=item * How can I do RPC in Perl?
+
+=back
+
+
 =back
 
 =head2 Where to get this document
@@ -66,6 +706,7 @@ at http://www.perl.com/perl/faq/ .
 You may mail corrections, additions, and suggestions to
 perlfaq-suggestions@perl.com .  This alias should not be 
 used to I<ask> FAQs.  It's for fixing the current FAQ.
+Send questions to the comp.lang.perl.misc newsgroup.
 
 =head2 What will happen if you mail your Perl programming problems to the authors
 
@@ -88,7 +729,7 @@ Perl Porters.
 
 =head1 Author and Copyright Information
 
-Copyright (c) 1997, 1998 Tom Christiansen and Nathan Torkington.
+Copyright (c) 1997-1999 Tom Christiansen and Nathan Torkington.
 All rights reserved.
 
 =head2 Bundled Distributions
@@ -117,6 +758,11 @@ in respect of this information or its use.
 
 =over 4
 
+=item 7/January/99
+
+Small touchups here and there.  Added all questions in this 
+document as a sort of table of contents.
+
 =item 22/June/98
 
 Significant changes throughout in preparation for the 5.005
@@ -170,3 +816,4 @@ This is the initial release of version 3 of the FAQ; consequently there
 have been no changes since its initial release.
 
 =back
+
index c6d53b3..6a752b9 100644 (file)
@@ -1,6 +1,6 @@
 =head1 NAME
 
-perlfaq1 - General Questions About Perl ($Revision: 1.15 $, $Date: 1998/08/05 11:52:24 $)
+perlfaq1 - General Questions About Perl ($Revision: 1.20 $, $Date: 1999/01/08 04:22:09 $)
 
 =head1 DESCRIPTION
 
@@ -32,12 +32,14 @@ the personal note at the end of the README file in the perl source
 distribution for more details.  See L<perlhist> (new as of 5.005)
 for Perl's milestone releases.
 
-In particular, the core development team (known as the Perl
-Porters) are a rag-tag band of highly altruistic individuals
-committed to producing better software for free than you
-could hope to purchase for money.  You may snoop on pending
-developments via news://news.perl.com/perl.porters-gw/ and
-http://www.frii.com/~gnat/perl/porters/summary.html.
+In particular, the core development team (known as the Perl Porters)
+are a rag-tag band of highly altruistic individuals committed
+to producing better software for free than you could hope to
+purchase for money.  You may snoop on pending developments via
+nntp://news.perl.com/perl.porters-gw/ and the Deja News archive at
+http://www.dejanews.com/ using the perl.porters-gw newsgroup, or you can
+subscribe to the mailing list by sending perl5-porters-request@perl.org
+a subscription request.
 
 While the GNU project includes Perl in its distributions, there's no
 such thing as "GNU Perl".  Perl is not produced nor maintained by the
@@ -51,12 +53,16 @@ users the informal support will more than suffice.  See the answer to
 =head2 Which version of Perl should I use?
 
 You should definitely use version 5.  Version 4 is old, limited, and
-no longer maintained; its last patch (4.036) was in 1992.  The most
-recent production release is 5.005_01.  Further references to the Perl
-language in this document refer to this production release unless
-otherwise specified.  There may be one or more official bug fixes for
-5.005_01 by the time you read this, and also perhaps some experimental
-versions on the way to the next release.
+no longer maintained; its last patch (4.036) was in 1992, long ago and
+far away.  Sure, it's stable, but so is anything that's dead; in fact,
+perl4 had been called a dead, flea-bitten camel carcass.  The most recent
+production release is 5.005_02 (although 5.004_04 is still supported).
+The most cutting-edge development release is 5.005_54.  Further references
+to the Perl language in this document refer to the production release
+unless otherwise specified.  There may be one or more official bug
+fixes for 5.005_02 by the time you read this, and also perhaps some
+experimental versions on the way to the next release.  All releases
+prior to 5.004 were subject to buffer overruns, a grave security issue.
 
 =head2 What are perl4 and perl5?
 
@@ -68,11 +74,12 @@ Perl5 is merely the popular name for the fifth major release (October 1994),
 while perl4 was the fourth major release (March 1991).  There was also a
 perl1 (in January 1988), a perl2 (June 1988), and a perl3 (October 1989).
 
-The 5.0 release is, essentially, a complete rewrite of the perl source
-code from the ground up.  It has been modularized, object-oriented,
-tweaked, trimmed, and optimized until it almost doesn't look like the
-old code.  However, the interface is mostly the same, and compatibility
-with previous releases is very high.
+The 5.0 release is, essentially, a ground-up rewrite of the original
+perl source code from releases 1 through 4.  It has been modularized,
+object-oriented, tweaked, trimmed, and optimized until it almost doesn't
+look like the old code.  However, the interface is mostly the same, and
+compatibility with previous releases is very high. See L<perltrap/"Perl4
+to Perl5 Traps">.
 
 To avoid the "what language is perl5?" confusion, some people prefer to
 simply use "perl" to refer to the latest version of perl and avoid using
@@ -80,6 +87,27 @@ simply use "perl" to refer to the latest version of perl and avoid using
 
 See L<perlhist> for a history of Perl revisions.
 
+=head2 What is perl6?
+
+Perl6 is a semi-jocular reference to the Topaz project.  Headed by Chip
+Salzenberg, Topaz is yet-another ground-up rewrite of the current release
+of Perl, one whose major goal is to create a more maintainable core than
+found in release 5.  Written in nominally portable C++, Topaz hopes to
+maintain 100% source-compatibility with previous releases of Perl but to
+run significantly faster and smaller.  The Topaz team hopes to provide
+an XS compatibility interface to allow most XS modules to work unchanged,
+albeit perhaps without the efficiency that the new interface uowld allow.
+New features in Topaz are as yet undetermined, and will be addressed
+once compatibility and performance goals are met.
+
+If you are a hard-working C++ wizard with a firm command of Perl's
+internals, and you would like to work on the project, send a request to
+perl6-porters-request@perl.org to subscribe to the Topaz mailing list.
+
+There is no ETA for Topaz.  It is expected to be several years before it
+achieves enough robustness, compatibility, portability, and performance
+to replace perl5 for ordinary use by mere mortals.
+
 =head2 How stable is Perl?
 
 Production releases, which incorporate bug fixes and new functionality,
@@ -106,18 +134,18 @@ to do it" (TMTOWTDI, sometimes pronounced "tim toady").  Perl's
 learning curve is therefore shallow (easy to learn) and long (there's
 a whole lot you can do if you really want).
 
-Finally, Perl is (frequently) an interpreted language.  This means
-that you can write your programs and test them without an intermediate
-compilation step, allowing you to experiment and test/debug quickly
-and easily.  This ease of experimentation flattens the learning curve
-even more.
+Finally, because Perl is frequently (but not always, and certainly not by
+definition) an interpreted language, you can write your programs and test
+them without an intermediate compilation step, allowing you to experiment
+and test/debug quickly and easily.  This ease of experimentation flattens
+the learning curve even more.
 
 Things that make Perl easier to learn: Unix experience, almost any kind
 of programming experience, an understanding of regular expressions, and
 the ability to understand other people's code.  If there's something you
 need to do, then it's probably already been done, and a working example is
 usually available for free.  Don't forget the new perl modules, either.
-They're discussed in Part 3 of this FAQ, along with the CPAN, which is
+They're discussed in Part 3 of this FAQ, along with CPAN, which is
 discussed in Part 2.
 
 =head2 How does Perl compare with other languages like Java, Python, REXX, Scheme, or Tcl?
@@ -130,22 +158,25 @@ Probably the best thing to do is try to write equivalent code to do a
 set of tasks.  These languages have their own newsgroups in which you
 can learn about (but hopefully not argue about) them.
 
+Some comparison documents can be found at http://language.perl.com/versus/
+if you really can't stop yourself.
+
 =head2 Can I do [task] in Perl?
 
-Perl is flexible and extensible enough for you to use on almost any
-task, from one-line file-processing tasks to complex systems.  For
-many people, Perl serves as a great replacement for shell scripting.
-For others, it serves as a convenient, high-level replacement for most
-of what they'd program in low-level languages like C or C++.  It's
-ultimately up to you (and possibly your management ...) which tasks
-you'll use Perl for and which you won't.
+Perl is flexible and extensible enough for you to use on virtually any
+task, from one-line file-processing tasks to large, elaborate systems.
+For many people, Perl serves as a great replacement for shell scripting.
+For others, it serves as a convenient, high-level replacement for most of
+what they'd program in low-level languages like C or C++.  It's ultimately
+up to you (and possibly your management) which tasks you'll use Perl
+for and which you won't.
 
 If you have a library that provides an API, you can make any component
 of it available as just another Perl function or variable using a Perl
 extension written in C or C++ and dynamically linked into your main
 perl interpreter.  You can also go the other direction, and write your
 main program in C or C++, and then link in some Perl code on the fly,
-to create a powerful application.
+to create a powerful application.  See L<perlembed>.
 
 That said, there will always be small, focused, special-purpose
 languages dedicated to a specific problem domain that are simply more
@@ -164,17 +195,16 @@ certain task (e.g. prolog, make).
 
 For various reasons, Perl is probably not well-suited for real-time
 embedded systems, low-level operating systems development work like
-device drivers or context-switching code, complex multithreaded
+device drivers or context-switching code, complex multi-threaded
 shared-memory applications, or extremely large applications.  You'll
 notice that perl is not itself written in Perl.
 
-The new native-code compiler for Perl may reduce the limitations given
-in the previous statement to some degree, but understand that Perl
-remains fundamentally a dynamically typed language, and not a
-statically typed one.  You certainly won't be chastized if you don't
-trust nuclear-plant or brain-surgery monitoring code to it.  And
-Larry will sleep easier, too -- Wall Street programs not
-withstanding. :-)
+The new, native-code compiler for Perl may eventually reduce the
+limitations given in the previous statement to some degree, but understand
+that Perl remains fundamentally a dynamically typed language, not
+a statically typed one.  You certainly won't be chastised if you don't
+trust nuclear-plant or brain-surgery monitoring code to it.  And Larry
+will sleep easier, too -- Wall Street programs not withstanding. :-)
 
 =head2 What's the difference between "perl" and "Perl"?
 
@@ -183,33 +213,58 @@ signify the language proper and "perl" the implementation of it,
 i.e. the current interpreter.  Hence Tom's quip that "Nothing but perl
 can parse Perl."  You may or may not choose to follow this usage.  For
 example, parallelism means "awk and perl" and "Python and Perl" look
-ok, while "awk and Perl" and "Python and perl" do not.
+ok, while "awk and Perl" and "Python and perl" do not.  But never
+write "PERL", because perl isn't really an acronym, aprocryphal
+folklore and post-facto expansions notwithstanding.
 
 =head2 Is it a Perl program or a Perl script?
 
-It doesn't matter.
-
-In "standard terminology" a I<program> has been compiled to physical
-machine code once, and can then be be run multiple times, whereas a
-I<script> must be translated by a program each time it's used.  Perl
-programs, however, are usually neither strictly compiled nor strictly
-interpreted.  They can be compiled to a byte code form (something of a
+Larry doesn't really care.  He says (half in jest) that "a script is
+what you give the actors.  A program is what you give the audience."
+
+Originally, a script was a canned sequence of normally interactive
+commands, that is, a chat script.  Something like a uucp or ppp chat
+script or an expect script fits the bill nicely, as do configuration
+scripts run by a program at its start up, such F<.cshrc> or F<.ircrc>,
+for example.  Chat scripts were just drivers for existing programs,
+not stand-alone programs in their own right.
+
+A computer scientist will correctly explain that all programs are
+interpreted, and that the only question is at what level.  But if you
+ask this question of someone who isn't a computer scientist, they might
+tell you that a I<program> has been compiled to physical machine code
+once, and can then be run multiple times, whereas a I<script> must be
+translated by a program each time it's used.
+
+Perl programs are (usually) neither strictly compiled nor strictly
+interpreted.  They can be compiled to a byte-code form (something of a
 Perl virtual machine) or to completely different languages, like C or
-assembly language.  You can't tell just by looking whether the source
-is destined for a pure interpreter, a parse-tree interpreter, a byte
-code interpreter, or a native-code compiler, so it's hard to give a
-definitive answer here.
+assembly language.  You can't tell just by looking at it whether the
+source is destined for a pure interpreter, a parse-tree interpreter,
+a byte-code interpreter, or a native-code compiler, so it's hard to give
+a definitive answer here.
+
+Now that "script" and "scripting" are terms that have been seized by
+unscrupulous or unknowing marketeers for their own nefarious purposes,
+they have begun to take on strange and often pejorative meanings,
+like "non serious" or "not real programming".  Consequently, some perl
+programmers prefer to avoid them altogether.
 
 =head2 What is a JAPH?
 
 These are the "just another perl hacker" signatures that some people
-sign their postings with.  About 100 of the of the earlier ones are
-available from http://www.perl.com/CPAN/misc/japh .
+sign their postings with.  Randal Schwartz made these famous.  About
+100 of the earlier ones are available from
+http://www.perl.com/CPAN/misc/japh .
 
 =head2 Where can I get a list of Larry Wall witticisms?
 
 Over a hundred quips by Larry, from postings of his or source code,
-can be found at http://www.perl.com/CPAN/misc/lwall-quotes .
+can be found at http://www.perl.com/CPAN/misc/lwall-quotes.txt.gz .
+
+Newer examples can be found by perusing Larry's postings:
+
+    http://x1.dejanews.com/dnquery.xp?QRY=*&DBS=2&ST=PS&defaultOp=AND&LNG=ALL&format=terse&showsort=date&maxhits=100&subjects=&groups=&authors=larry@*wall.org&fromdate=&todate=
 
 =head2 How can I convince my sysadmin/supervisor/employees to use version (5/5.005/Perl instead of some other language)?
 
@@ -232,28 +287,29 @@ many Unix vendors now ship Perl by default, and support is usually
 just a news-posting away, if you can't find the answer in the
 I<comprehensive> documentation, including this FAQ.
 
+See http://www.perl.org/advocacy/ for more information.
+
 If you face reluctance to upgrading from an older version of perl,
 then point out that version 4 is utterly unmaintained and unsupported
 by the Perl Development Team.  Another big sell for Perl5 is the large
 number of modules and extensions which greatly reduce development time
 for any given task.  Also mention that the difference between version
 4 and version 5 of Perl is like the difference between awk and C++.
-(Well, ok, maybe not quite that distinct, but you get the idea.)  If
-you want support and a reasonable guarantee that what you're
-developing will continue to work in the future, then you have to run
-the supported version.  That probably means running the 5.005 release,
-although 5.004 isn't that bad (it's just one year and one release
-behind).  Several important bugs were fixed from the 5.000 through
+(Well, ok, maybe not quite that distinct, but you get the idea.)  If you
+want support and a reasonable guarantee that what you're developing
+will continue to work in the future, then you have to run the supported
+version.  That probably means running the 5.005 release, although 5.004
+isn't that bad.  Several important bugs were fixed from the 5.000 through
 5.003 versions, though, so try upgrading past them if possible.
 
 Of particular note is the massive bughunt for buffer overflow
 problems that went into the 5.004 release.  All releases prior to
 that, including perl4, are considered insecure and should be upgraded
-as soon as possible. 
+as soon as possible.
 
 =head1 AUTHOR AND COPYRIGHT
 
-Copyright (c) 1997, 1998 Tom Christiansen and Nathan Torkington.
+Copyright (c) 1997-1999 Tom Christiansen and Nathan Torkington.
 All rights reserved.
 
 When included as an integrated part of the Standard Distribution
@@ -266,3 +322,4 @@ domain.  You are permitted and encouraged to use this code and any
 derivatives thereof in your own programs for fun or for profit as you
 see fit.  A simple comment in the code giving credit to the FAQ would
 be courteous but is not required.
+
index 918e936..13a2907 100644 (file)
@@ -1,6 +1,6 @@
 =head1 NAME
 
-perlfaq2 - Obtaining and Learning about Perl ($Revision: 1.25 $, $Date: 1998/08/05 11:47:25 $)
+perlfaq2 - Obtaining and Learning about Perl ($Revision: 1.30 $, $Date: 1998/12/29 19:43:32 $)
 
 =head1 DESCRIPTION
 
@@ -12,7 +12,7 @@ related matters.
 
 The standard release of Perl (the one maintained by the perl
 development team) is distributed only in source code form.  You
-can find this at http://www.perl.com/CPAN/src/latest.tar.gz, which
+can find this at http://www.perl.com/CPAN/src/latest.tar.gz , which
 in standard Internet format (a gzipped archive in POSIX tar format).
 
 Perl builds and runs on a bewildering number of platforms.  Virtually
@@ -22,7 +22,7 @@ QNX, BeOS, and the Amiga.  There are also the beginnings of support
 for MPE/iX.
 
 Binary distributions for some proprietary platforms, including
-Apple systems can be found http://www.perl.com/CPAN/ports/ directory.
+Apple systems, can be found http://www.perl.com/CPAN/ports/ directory.
 Because these are not part of the standard distribution, they may
 and in fact do differ from the base Perl port in a variety of ways.
 You'll have to check their respective release notes to see just
@@ -31,22 +31,23 @@ what the differences are.  These differences can be either positive
 are not supported in the source release of perl) or negative (e.g.
 might be based upon a less current source release of perl).
 
-A useful FAQ for Win32 Perl users is
-http://www.endcontsw.com/people/evangelo/Perl_for_Win32_FAQ.html
-
 =head2 How can I get a binary version of Perl?
 
-If you don't have a C compiler because for whatever reasons your
-vendor did not include one with your system, the best thing to do is
+If you don't have a C compiler because your vendor for whatever
+reasons did not include one with your system, the best thing to do is
 grab a binary version of gcc from the net and use that to compile perl
 with.  CPAN only has binaries for systems that are terribly hard to
 get free compilers for, not for Unix systems.
 
-Your first stop should be http://www.perl.com/CPAN/ports to see what
-information is already available.  A simple installation guide for
-MS-DOS is available at http://www.cs.ruu.nl/~piet/perl5dos.html , and
-similarly for Windows 3.1 at http://www.cs.ruu.nl/~piet/perlwin3.html
-.
+Some URLs that might help you are:
+
+    http://language.perl.com/info/software.html
+    http://www.perl.com/latest/
+    http://www.perl.com/CPAN/ports/
+
+If you want information on proprietary systems.  A simple installation
+guide for MS-DOS is available at http://www.cs.ruu.nl/~piet/perl5dos.html
+and similarly for Windows 3.1 at http://www.cs.ruu.nl/~piet/perlwin3.html .
 
 =head2 I don't have a C compiler on my system.  How can I compile perl?
 
@@ -67,11 +68,14 @@ approaches are doomed to failure.
 One simple way to check that things are in the right place is to print out
 the hard-coded @INC which perl is looking for.
 
-       perl -e 'print join("\n",@INC)'
+    % perl -e 'print join("\n",@INC)'
 
 If this command lists any paths which don't exist on your system, then you
 may need to move the appropriate libraries to these locations, or create
-symlinks, aliases, or shortcuts appropriately.
+symlinks, aliases, or shortcuts appropriately.  @INC is also printed as
+part of the output of
+
+    % perl -V
 
 You might also want to check out L<perlfaq8/"How do I keep my own
 module/library directory?">.
@@ -79,7 +83,7 @@ module/library directory?">.
 =head2 I grabbed the sources and tried to compile but gdbm/dynamic loading/malloc/linking/... failed.  How do I make it work?
 
 Read the F<INSTALL> file, which is part of the source distribution.
-It describes in detail how to cope with most idiosyncracies that the
+It describes in detail how to cope with most idiosyncrasies that the
 Configure script can't work around for any given system or
 architecture.
 
@@ -141,6 +145,16 @@ http://www.perl.com/perl/info/documentation.html that might help.
 Many good books have been written about Perl -- see the section below
 for more details.
 
+Tutorial documents are included in current or upcoming Perl releases
+include L<perltoot> for objects, L<perlopentut> for file opening
+semantics, L<perlreftut> for managing references, and L<perlxstut>
+for linking C and Perl together.  There may be more by the 
+time you read this.  The following URLs might also be of 
+assistance:
+
+    http://language.perl.com/info/documentation.html
+    http://reference.perl.com/query.cgi?tutorials
+
 =head2 What are the Perl newsgroups on USENET?  Where do I post questions?
 
 The now defunct comp.lang.perl newsgroup has been superseded by the
@@ -154,20 +168,17 @@ following groups:
 
     comp.infosystems.www.authoring.cgi         Writing CGI scripts for the Web.
 
-Actually, the moderated group hasn't passed yet, but we're
-keeping our fingers crossed.
-
 There is also USENET gateway to the mailing list used by the crack
 Perl development team (perl5-porters) at
 news://news.perl.com/perl.porters-gw/ .
 
 =head2 Where should I post source code?
 
-You should post source code to whichever group is most appropriate,
-but feel free to cross-post to comp.lang.perl.misc.  If you want to
-cross-post to alt.sources, please make sure it follows their posting
-standards, including setting the Followup-To header line to NOT
-include alt.sources; see their FAQ for details.
+You should post source code to whichever group is most appropriate, but
+feel free to cross-post to comp.lang.perl.misc.  If you want to cross-post
+to alt.sources, please make sure it follows their posting standards,
+including setting the Followup-To header line to NOT include alt.sources;
+see their FAQ (http://www.faqs.org/faqs/alt-sources-intro/) for details.
 
 If you're just looking for software, first use Alta Vista, Deja News, and
 search CPAN.  This is faster and more productive than just posting
@@ -184,7 +195,7 @@ The incontestably definitive reference book on Perl, written by
 the creator of Perl, is now in its second edition:
 
     Programming Perl (the "Camel Book"):
-       Authors: Larry Wall, Tom Christiansen, and Randal Schwartz
+       by Larry Wall, Tom Christiansen, and Randal Schwartz
         ISBN 1-56592-149-6      (English)
         ISBN 4-89052-384-7      (Japanese)
        URL: http://www.oreilly.com/catalog/pperl2/
@@ -196,7 +207,7 @@ of real-world examples, mini-tutorials, and complete programs
 (first premiering at the 1998 Perl Conference), is:
 
     The Perl Cookbook (the "Ram Book"):
-       Authors: Tom Christiansen and Nathan Torkington, 
+       by Tom Christiansen and Nathan Torkington, 
                    with Foreword by Larry Wall
        ISBN: 1-56592-243-3
        URL:  http://perl.oreilly.com/cookbook/
@@ -206,7 +217,7 @@ might suffice for you to learn Perl from.  But if you're not, check
 out:
 
     Learning Perl (the "Llama Book"):
-       Authors: Randal Schwartz and Tom Christiansen 
+       by Randal Schwartz and Tom Christiansen 
                    with Foreword by Larry Wall
        ISBN: 1-56592-284-0
        URL:  http://www.oreilly.com/catalog/lperl2/
@@ -230,7 +241,7 @@ See http://www.ora.com/ on the Web.
 What follows is a list of the books that the FAQ authors found personally
 useful.  Your mileage may (but, we hope, probably won't) vary.
 
-Recommended books on (or muchly on) Perl follow; those marked with
+Recommended books on (or mostly on) Perl follow; those marked with
 a star may be ordered from O'Reilly.
 
 =over
@@ -262,7 +273,7 @@ a star may be ordered from O'Reilly.
     MacPerl: Power and Ease 
        by Vicki Brown and Chris Nandor, foreword by Matthias Neeracher
 
-=item Task-Oriented
+=item Task-Oriented 
 
     *The Perl Cookbook
        by Tom Christiansen and Nathan Torkington
@@ -296,7 +307,7 @@ development, databases, Win32 Perl, graphical programming, regular
 expressions, and networking, and sponsors the Obfuscated Perl
 Contest.  It is published quarterly under the gentle hand of its
 editor, Jon Orwant.  See http://www.tpj.com/ or send mail to
-subscriptions@tpj.com.
+subscriptions@tpj.com .
 
 Beyond this, magazines that frequently carry high-quality articles
 on Perl are I<Web Techniques> (see http://www.webtechniques.com/),
@@ -309,10 +320,11 @@ http://www.stonehenge.com/merlyn/WebTechniques/.
 
 To get the best (and possibly cheapest) performance, pick a site from
 the list below and use it to grab the complete list of mirror sites.
-From there you can find the quickest site for you.  Remember, the
+>From there you can find the quickest site for you.  Remember, the
 following list is I<not> the complete list of CPAN mirrors.
 
-  http://www.perl.com/CPAN     (redirects to another mirror)
+  http://www.perl.com/CPAN-local
+  http://www.perl.com/CPAN     (redirects to an ftp mirror)
   http://www.perl.org/CPAN
   ftp://ftp.funet.fi/pub/languages/perl/CPAN/
   http://www.cs.ruu.nl/pub/PERL/CPAN/
@@ -322,69 +334,19 @@ following list is I<not> the complete list of CPAN mirrors.
 
 Most of the major modules (tk, CGI, libwww-perl) have their own
 mailing lists.  Consult the documentation that came with the module for
-subscription information.  The following are a list of mailing lists
-related to perl itself.
-
-If you subscribe to a mailing list, it behooves you to know how to
-unsubscribe from it.  Strident pleas to the list itself to get you off
-will not be favorably received.
-
-=over 4
-
-=item MacPerl
-
-There is a mailing list for discussing Macintosh Perl.  Contact
-"mac-perl-request@iis.ee.ethz.ch".
-
-Also see Matthias Neeracher's (the creator and maintainer of MacPerl)
-webpage at http://www.iis.ee.ethz.ch/~neeri/macintosh/perl.html for
-many links to interesting MacPerl sites, and the applications/MPW
-tools, precompiled.
-
-=item Perl5-Porters
-
-The core development team have a mailing list for discussing fixes and
-changes to the language.  Send mail to
-"perl5-porters-request@perl.org" with help in the body of the message
-for information on subscribing.
-
-=item NTPerl
+subscription information.  The Perl Institute attempts to maintain a
+list of mailing lists at:
 
-This list is used to discuss issues involving Win32 Perl 5 (Windows NT
-and Win95). Subscribe by mailing ListManager@ActiveWare.com with the
-message body:
+       http://www.perl.org/maillist.html
 
-    subscribe Perl-Win32-Users
-
-The list software, also written in perl, will automatically determine
-your address, and subscribe you automatically.  To unsubscribe, mail
-the following in the message body to the same address like so:
-
-    unsubscribe Perl-Win32-Users
-
-You can also check http://www.activeware.com/ and select "Mailing Lists"
-to join or leave this list.
-
-=item Perl-Packrats
-
-Discussion related to archiving of perl materials, particularly the
-Comprehensive Perl Archive Network (CPAN). Subscribe by emailing
-majordomo@cis.ufl.edu:
-
-    subscribe perl-packrats
-
-The list software, also written in perl, will automatically determine
-your address, and subscribe you automatically.  To unsubscribe, simple
-prepend the same command with an "un", and mail to the same address
-like so:
-
-    unsubscribe perl-packrats
+=head2 Archives of comp.lang.perl.misc
 
-=back
+Have you tried Deja News or Alta Vista?  Those are the 
+best archives.  Just look up "*perl*" as a newsgroup.
 
-=head2 Archives of comp.lang.perl.misc
+    http://www.dejanews.com/dnquery.xp?QRY=&DBS=2&ST=PS&defaultOp=AND&LNG=ALL&format=terse&showsort=date&maxhits=25&subjects=&groups=*perl*&authors=&fromdate=&todate=
 
-Have you tried Deja News or Alta Vista?
+You'll probably want to trim that down a bit, though.
 
 ftp.cis.ufl.edu:/pub/perl/comp.lang.perl.*/monthly has an almost
 complete collection dating back to 12/89 (missing 08/91 through
@@ -402,21 +364,24 @@ let perlfaq-suggestions@perl.com know.
 
 =head2 Where can I buy a commercial version of Perl?
 
-In a sense, Perl already I<is> commercial software: It has a licence
-that you can grab and carefully read to your manager. It is
-distributed in releases and comes in well-defined packages. There is a
-very large user community and an extensive literature.  The
-comp.lang.perl.* newsgroups and several of the mailing lists provide
-free answers to your questions in near real-time.  Perl has
-traditionally been supported by Larry, dozens of software designers
-and developers, and thousands of programmers, all working for free
-to create a useful thing to make life better for everyone.
+In a real sense, Perl already I<is> commercial software: It has a licence
+that you can grab and carefully read to your manager. It is distributed
+in releases and comes in well-defined packages. There is a very large
+user community and an extensive literature.  The comp.lang.perl.*
+newsgroups and several of the mailing lists provide free answers to your
+questions in near real-time.  Perl has traditionally been supported by
+Larry, scores of software designers and developers, and myriads of
+programmers, all working for free to create a useful thing to make life
+better for everyone.
 
 However, these answers may not suffice for managers who require a
-purchase order from a company whom they can sue should anything go
-wrong.  Or maybe they need very serious hand-holding and contractual
-obligations.  Shrink-wrapped CDs with perl on them are available from
-several sources if that will help.
+purchase order from a company whom they can sue should anything go awry.
+Or maybe they need very serious hand-holding and contractual obligations.
+Shrink-wrapped CDs with perl on them are available from several sources if
+that will help.  For example, many perl books carry a perl distribution
+on them, as do the O'Reily Perl Resource Kits (in both the Unix flavor
+and in the proprietary Microsoft flavor); the free Unix distributions
+also all come with Perl.
 
 Or you can purchase a real support contract.  Although Cygnus historically
 provided this service, they no longer sell support contracts for Perl.
@@ -438,20 +403,20 @@ Oraperl and related modules (which Oracle is planning to ship as part
 of Oracle Web Server 3).  20% of the profit from our Perl support work
 will be donated to The Perl Institute."
 
-For more information, contact the The Perl Clinic:
+For more information, contact The Perl Clinic:
 
     Tel:    +44 1483 424424
     Fax:    +44 1483 419419
     Web:    http://www.perl.co.uk/
     Email:  perl-support-info@perl.co.uk or Tim.Bunce@ig.co.uk
 
-See also www.perl.com for updates on training and support.
+See also www.perl.com for updates on tutorials, training, and support.
 
 =head2 Where do I send bug reports?
 
 If you are reporting a bug in the perl interpreter or the modules
 shipped with perl, use the I<perlbug> program in the perl distribution or
-mail your report to perlbug@perl.com.
+mail your report to perlbug@perl.com .
 
 If you are posting a bug with a non-standard port (see the answer to
 "What platforms is Perl available for?"), a binary distribution, or a
@@ -461,30 +426,24 @@ bugs.
 
 Read the perlbug(1) man page (perl5.004 or later) for more information.
 
-=head2 What is perl.com?  perl.org?  The Perl Institute?
+=head2 What is perl.com?  
 
-The perl.com domain is managed by Tom Christiansen, who created it as a
+The perl.com domain is owned by Tom Christiansen, who created it as a
 public service long before perl.org came about.  Despite the name, it's a
 pretty non-commercial site meant to be a clearinghouse for information
 about all things Perlian, accepting no paid advertisements, bouncy
 happy gifs, or silly java applets on its pages.  The Perl Home Page at
 http://www.perl.com/ is currently hosted on a T3 line courtesy of Songline
 Systems, a software-oriented subsidiary of O'Reilly and Associates.
+Other starting points include 
 
-perl.org is the official vehicle for The Perl Institute.  The motto of
-TPI is "helping people help Perl help people" (or something like
-that).  It's a non-profit organization supporting development,
-documentation, and dissemination of perl.  
-
-=head2 How do I learn about object-oriented Perl programming?
-
-L<perltoot> (distributed with 5.004 or later) is a good place to start.
-Also, L<perlobj>, L<perlref>, and L<perlmod> are useful references,
-while L<perlbot> has some excellent tips and tricks.
+    http://language.perl.com/
+    http://conference.perl.com/
+    http://reference.perl.com/
 
 =head1 AUTHOR AND COPYRIGHT
 
-Copyright (c) 1997, 1998 Tom Christiansen and Nathan Torkington.
+Copyright (c) 1997-1999 Tom Christiansen and Nathan Torkington.
 All rights reserved.
 
 When included as an integrated part of the Standard Distribution
@@ -497,3 +456,4 @@ domain.  You are permitted and encouraged to use this code and any
 derivatives thereof in your own programs for fun or for profit as you
 see fit.  A simple comment in the code giving credit to the FAQ would
 be courteous but is not required.
+
index 478b080..28e64ec 100644 (file)
@@ -1,6 +1,6 @@
 =head1 NAME
 
-perlfaq3 - Programming Tools ($Revision: 1.29 $, $Date: 1998/08/05 11:57:04 $)
+perlfaq3 - Programming Tools ($Revision: 1.33 $, $Date: 1998/12/29 20:12:12 $)
 
 =head1 DESCRIPTION
 
@@ -102,6 +102,10 @@ on your hardware, operating system, and the load on your machine):
          for:  4 secs ( 3.97 usr  0.01 sys =  3.98 cpu)
          map:  6 secs ( 4.97 usr  0.00 sys =  4.97 cpu)
 
+Be aware that a good benchmark is very hard to write.  It only tests the
+data you give it, and really proves little about differing complexities
+of contrasting algorithms.
+
 =head2 How do I cross-reference my Perl programs?
 
 The B::Xref module, shipped with the new, alpha-release Perl compiler
@@ -122,23 +126,50 @@ shouldn't need to reformat.  The habit of formatting your code as you
 write it will help prevent bugs.  Your editor can and should help you
 with this.  The perl-mode for emacs can provide a remarkable amount of
 help with most (but not all) code, and even less programmable editors
-can provide significant assistance.
+can provide significant assistance.  Tom swears by the following
+settings in vi and its clones:
+
+    set ai sw=4
+    map ^O {^M}^[O^T
+
+Now put that in your F<.exrc> file (replacing the caret characters
+with control characters) and away you go.  In insert mode, ^T is
+for indenting, ^D is for undenting, and ^O is for blockdenting --
+as it were.  If you haven't used the last one, you're missing
+a lot.  A more complete example, with comments, can be found at
+http://www.perl.com/CPAN-local/authors/id/TOMC/scripts/toms.exrc.gz
 
-If you are used to using I<vgrind> program for printing out nice code
+If you are used to using the I<vgrind> program for printing out nice code
 to a laser printer, you can take a stab at this using
 http://www.perl.com/CPAN/doc/misc/tips/working.vgrind.entry, but the
 results are not particularly satisfying for sophisticated code.
 
+The a2ps at http://www.infres.enst.fr/~demaille/a2ps/ does lots of things
+related to generating nicely printed output of documents.
+
 =head2 Is there a ctags for Perl?
 
 There's a simple one at
 http://www.perl.com/CPAN/authors/id/TOMC/scripts/ptags.gz which may do
-the trick.
+the trick.  And if not, it's easy to hack into what you want.
+
+=head2 Is there an IDE or Windows Perl Editor?
+
+If you're on Unix, you already have an IDE -- Unix itself.
+You just have to learn the toolbox.  If you're not, then you
+probably don't have a toolbox, so may need something else.
+
+PerlBuilder (XXX URL to follow) is an integrated development
+environment for Windows that supports Perl development.  Perl programs
+are just plain text, though, so you could download emacs for Windows
+(XXX) or vim for win32 (http://www.cs.vu.nl/~tmgil/vi.html).  If
+you're transferring Windows files to Unix, be sure to transfer in
+ASCII mode so the ends of lines are appropriately converted.
 
 =head2 Where can I get Perl macros for vi?
 
 For a complete version of Tom Christiansen's vi configuration file,
-see http://www.perl.com/CPAN/authors/Tom_Christiansen/scripts/toms.exrc,
+see http://www.perl.com/CPAN/authors/Tom_Christiansen/scripts/toms.exrc.gz,
 the standard benchmark file for vi emulators.  This runs best with nvi,
 the current version of vi out of Berkeley, which incidentally can be built
 with an embedded Perl interpreter -- see http://www.perl.com/CPAN/src/misc.
@@ -155,7 +186,7 @@ context-sensitive help, and other nifty things.
 
 Note that the perl-mode of emacs will have fits with C<"main'foo">
 (single quote), and mess up the indentation and hilighting.  You
-should be using C<"main::foo"> in new Perl code anyway, so this
+are probably using C<"main::foo"> in new Perl code anyway, so this
 shouldn't be an issue.
 
 =head2 How can I use curses with Perl?
@@ -236,7 +267,7 @@ wasn't a good solution anyway.
 
 When it comes to time-space tradeoffs, Perl nearly always prefers to
 throw memory at a problem.  Scalars in Perl use more memory than
-strings in C, arrays take more that, and hashes use even more.  While
+strings in C, arrays take more than that, and hashes use even more.  While
 there's still a lot to be done, recent releases have been addressing
 these issues.  For example, as of 5.004, duplicate hash keys are
 shared amongst all hashes using them, so require no reallocation.
@@ -278,10 +309,15 @@ No, Perl's garbage collection system takes care of this.
 
 You can't.  On most operating systems, memory allocated to a program
 can never be returned to the system.  That's why long-running programs
-sometimes re-exec themselves.  Some operating systems (notably, FreeBSD)
-allegedly reclaim large chunks of memory that is no longer used, but
-it doesn't appear to happen with Perl (yet).  The Mac appears to be the
-only platform that will reliably (albeit, slowly) return memory to the OS.
+sometimes re-exec themselves.  Some operating systems (notably,
+FreeBSD and Linux) allegedly reclaim large chunks of memory that is no
+longer used, but it doesn't appear to happen with Perl (yet).  The Mac
+appears to be the only platform that will reliably (albeit, slowly)
+return memory to the OS.
+
+We've had reports that on Linux (Redhat 5.1) on Intel, C<undef
+$scalar> will return memory to the system, while on Solaris 2.6 it
+won't.  In general, try it yourself and see.
 
 However, judicious use of my() on your variables will help make sure
 that they go out of scope so that Perl can free up their storage for
@@ -314,8 +350,7 @@ the internal server API, so modules written in Perl can do just about
 anything a module written in C can.  For more on mod_perl, see
 http://perl.apache.org/
 
-With the FCGI module (from CPAN), a Perl executable compiled with sfio
-(see the F<INSTALL> file in the distribution) and the mod_fastcgi
+With the FCGI module (from CPAN) and the mod_fastcgi
 module (available from http://www.fastcgi.com/) each of your perl
 scripts becomes a permanent CGI daemon process.
 
@@ -325,7 +360,7 @@ care.
 
 See http://www.perl.com/CPAN/modules/by-category/15_World_Wide_Web_HTML_HTTP_CGI/ .
 
-A non-free, commerical product, ``The Velocity Engine for Perl'',
+A non-free, commercial product, ``The Velocity Engine for Perl'',
 (http://www.binevolve.com/ or http://www.binevolve.com/bine/vep) might
 also be worth looking at.  It will allow you to increase the performance
 of your perl scripts, upto 25 times faster than normal CGI perl by
@@ -353,12 +388,12 @@ source.  Security through obscurity, the name for hiding your bugs
 instead of fixing them, is little security indeed.
 
 You can try using encryption via source filters (Filter::* from CPAN),
-but crackers might be able to decrypt it.  You can try using the byte
-code compiler and interpreter described below, but crackers might be
-able to de-compile it.  You can try using the native-code compiler
-described below, but crackers might be able to disassemble it.  These
-pose varying degrees of difficulty to people wanting to get at your
-code, but none can definitively conceal it (this is true of every
+but any decent programmer will be able to decrypt it.  You can try using
+the byte code compiler and interpreter described below, but the curious
+might still be able to de-compile it.  You can try using the native-code
+compiler described below, but crackers might be able to disassemble it.
+These pose varying degrees of difficulty to people wanting to get at
+your code, but none can definitively conceal it (this is true of every
 language, not just Perl).
 
 If you're concerned about people profiting from your code, then the
@@ -407,6 +442,14 @@ packaging, and once you see the size of what it makes (well, unless
 you use a shared I<libperl.so>), you'll probably want a complete
 Perl install anyway.
 
+=head2 How can I compile Perl into Java?
+
+You can't.  Not yet, anyway.  You can integrate Java and Perl with the
+Perl Resource Kit from O'Reilly and Associates.  See
+http://www.oreilly.com/catalog/prkunix/ for more information.
+The Java interface will be supported in the core 5.006 release
+of Perl.
+
 =head2 How can I get C<#!perl> to work on [MS-DOS,NT,...]?
 
 For OS/2 just use
@@ -420,10 +463,13 @@ F<INSTALL> file in the source distribution for more information).
 
 The Win95/NT installation, when using the ActiveState port of Perl,
 will modify the Registry to associate the C<.pl> extension with the
-perl interpreter.  If you install another port (Gurusaramy Sarathy's
-is the recommended Win95/NT port), or (eventually) build your own
-Win95/NT Perl using WinGCC, then you'll have to modify the Registry
-yourself.
+perl interpreter.  If you install another port (Gurusamy Sarathy's is
+the recommended Win95/NT port), or (eventually) build your own
+Win95/NT Perl using a Windows port of gcc (e.g., with cygwin32 or
+mingw32), then you'll have to modify the Registry yourself.  In
+addition to associating C<.pl> with the interpreter, NT people can
+use: C<SET PATHEXT=%PATHEXT%;.PL> to let them run the program
+C<install-linux.pl> merely by typing C<install-linux>.
 
 Macintosh perl scripts will have the appropriate Creator and
 Type, so that double-clicking them will invoke the perl application.
@@ -494,6 +540,9 @@ shell, or MPW, is much like Unix shells in its support for several
 quoting variants, except that it makes free use of the Mac's non-ASCII
 characters as control characters.
 
+Using qq(), q(), and qx(), instead of "double quotes", 'single
+quotes', and `backticks`, may make one-liners easier to write.
+
 There is no general solution to all of this.  It is a mess, pure and
 simple.  Sucks to be away from Unix, huh? :-)
 
@@ -580,7 +629,7 @@ information, see L<ExtUtils::MakeMaker>.
 
 =head1 AUTHOR AND COPYRIGHT
 
-Copyright (c) 1997, 1998 Tom Christiansen and Nathan Torkington.
+Copyright (c) 1997-1999 Tom Christiansen and Nathan Torkington.
 All rights reserved.
 
 When included as an integrated part of the Standard Distribution
@@ -593,3 +642,4 @@ domain.  You are permitted and encouraged to use this code and any
 derivatives thereof in your own programs for fun or for profit as you
 see fit.  A simple comment in the code giving credit to the FAQ would
 be courteous but is not required.
+
index 39325c2..c477b9d 100644 (file)
@@ -1,6 +1,6 @@
 =head1 NAME
 
-perlfaq4 - Data Manipulation ($Revision: 1.26 $, $Date: 1998/08/05 12:04:00 $)
+perlfaq4 - Data Manipulation ($Revision: 1.40 $, $Date: 1999/01/08 04:26:39 $)
 
 =head1 DESCRIPTION
 
@@ -41,7 +41,7 @@ are consequently slower.
 
 To get rid of the superfluous digits, just use a format (eg,
 C<printf("%.2f", 19.95)>) to get the required precision.
-See L<perlop/"Floating-point Arithmetic">.
+See L<perlop/"Floating-point Arithmetic">.  
 
 =head2 Why isn't my octal data interpreted correctly?
 
@@ -59,7 +59,7 @@ umask(), or sysopen(), which all want permissions in octal.
     chmod(644,  $file);        # WRONG -- perl -w catches this
     chmod(0644, $file);        # right
 
-=head2 Does perl have a round function?  What about ceil() and floor()?  Trig functions?
+=head2 Does Perl have a round() function?  What about ceil() and floor()?  Trig functions?
 
 Remember that int() merely truncates toward 0.  For rounding to a
 certain number of digits, sprintf() or printf() is usually the easiest
@@ -88,6 +88,19 @@ cases, it probably pays not to trust whichever system rounding is
 being used by Perl, but to instead implement the rounding function you
 need yourself.
 
+To see why, notice how you'll still have an issue on half-way-point
+alternation:
+
+    for ($i = 0; $i < 1.01; $i += 0.05) { printf "%.1f ",$i}
+
+    0.0 0.1 0.1 0.2 0.2 0.2 0.3 0.3 0.4 0.4 0.5 0.5 0.6 0.7 0.7 
+    0.8 0.8 0.9 0.9 1.0 1.0
+
+Don't blame Perl.  It's the same as in C.  IEEE says we have to do this.
+Perl numbers whose absolute values are integers under 2**31 (on 32 bit
+machines) will work pretty much like mathematical integers.  Other numbers
+are not guaranteed.
+
 =head2 How do I convert bits into ints?
 
 To turn a string of 1s and 0s like C<10110110> into a scalar containing
@@ -100,6 +113,33 @@ Here's an example of going the other way:
 
     $binary_string = join('', unpack('B*', "\x29"));
 
+=head2 Why doesn't & work the way I want it to?
+
+The behavior of binary arithmetic operators depends on whether they're
+used on numbers or strings.  The operators treat a string as a series
+of bits and work with that (the string C<"3"> is the bit pattern
+C<00110011>).  The operators work with the binary form of a number
+(the number C<3> is treated as the bit pattern C<00000011>).
+
+So, saying C<11 & 3> performs the "and" operation on numbers (yielding
+C<1>).  Saying C<"11" & "3"> performs the "and" operation on strings
+(yielding C<"1">).
+
+Most problems with C<&> and C<|> arise because the programmer thinks
+they have a number but really it's a string.  The rest arise because
+the programmer says:
+
+    if ("\020\020" & "\101\101") {
+       # ...
+    }
+
+but a string consisting of two null bytes (the result of C<"\020\020"
+& "\101\101">) is not a false value in Perl.  You need:
+
+    if ( ("\020\020" & "\101\101") !~ /[^\000]/) {
+       # ...
+    }
+
 =head2 How do I multiply matrices?
 
 Use the Math::Matrix or Math::MatrixReal modules (available from CPAN)
@@ -120,12 +160,12 @@ To call a function on each element of an array, but ignore the
 results:
 
     foreach $iterator (@array) {
-        &my_func($iterator);
+        some_func($iterator);
     }
 
 To call a function on each integer in a (small) range, you B<can> use:
 
-    @results = map { &my_func($_) } (5 .. 25);
+    @results = map { some_func($_) } (5 .. 25);
 
 but you should be aware that the C<..> operator creates an array of
 all integers in the range.  This can take a lot of memory for large
@@ -133,7 +173,7 @@ ranges.  Instead use:
 
     @results = ();
     for ($i=5; $i < 500_005; $i++) {
-        push(@results, &my_func($i));
+        push(@results, some_func($i));
     }
 
 =head2 How can I output Roman numerals?
@@ -142,20 +182,25 @@ Get the http://www.perl.com/CPAN/modules/by-module/Roman module.
 
 =head2 Why aren't my random numbers random?
 
-The short explanation is that you're getting pseudorandom numbers, not
-random ones, because computers are good at being predictable and bad
-at being random (despite appearances caused by bugs in your programs
-:-).  A longer explanation is available on
-http://www.perl.com/CPAN/doc/FMTEYEWTK/random, courtesy of Tom
-Phoenix.  John von Neumann said, ``Anyone who attempts to generate
-random numbers by deterministic means is, of course, living in a state
-of sin.''
+If you're using a version of Perl before 5.004, you must call C<srand>
+once at the start of your program to seed the random number generator.
+5.004 and later automatically call C<srand> at the beginning.  Don't
+call C<srand> more than once--you make your numbers less random, rather
+than more.
 
-You should also check out the Math::TrulyRandom module from CPAN.  It
-uses the imperfections in your system's timer to generate random
-numbers, but this takes quite a while.  If you want a better
+Computers are good at being predictable and bad at being random
+(despite appearances caused by bugs in your programs :-).
+http://www.perl.com/CPAN/doc/FMTEYEWTK/random, courtesy of Tom
+Phoenix, talks more about this..  John von Neumann said, ``Anyone who
+attempts to generate random numbers by deterministic means is, of
+course, living in a state of sin.''
+
+If you want numbers that are more random than C<rand> with C<srand>
+provides, you should also check out the Math::TrulyRandom module from
+CPAN.  It uses the imperfections in your system's timer to generate
+random numbers, but this takes quite a while.  If you want a better
 pseudorandom generator than comes with your operating system, look at
-``Numerical Recipes in C'' at http://nr.harvard.edu/nr/bookc.html .
+``Numerical Recipes in C'' at http://www.nr.com/ .
 
 =head1 Data: Dates
 
@@ -178,10 +223,10 @@ You can find the week of the year by dividing this by 7:
 Of course, this believes that weeks start at zero.  The Date::Calc
 module from CPAN has a lot of date calculation functions, including
 day of the year, week of the year, and so on.   Note that not
-all business consider ``week 1'' to be the same; for example,
-American business often consider the first week with a Monday
-in it to be Work Week #1, despite ISO 8601, which consider 
-WW1 to be the frist week with a Thursday in it.
+all businesses consider ``week 1'' to be the same; for example,
+American businesses often consider the first week with a Monday
+in it to be Work Week #1, despite ISO 8601, which considers
+WW1 to be the first week with a Thursday in it.
 
 =head2 How can I compare two dates and find the difference?
 
@@ -204,20 +249,34 @@ there is an example of Julian date calculation that should help you in
 http://www.perl.com/CPAN/authors/David_Muir_Sharnoff/modules/Time/JulianDay.pm.gz
 .
 
+=head2 How do I find yesterday's date?
+
+The C<time()> function returns the current time in seconds since the
+epoch.  Take one day off that:
+
+    $yesterday = time() - ( 24 * 60 * 60 );
+
+Then you can pass this to C<localtime()> and get the individual year,
+month, day, hour, minute, seconds values.
+
 =head2 Does Perl have a year 2000 problem?  Is Perl Y2K compliant?
 
-Short answer: No, Perl does not have a Year 2000 problem.  Yes,
-Perl is Y2K compliant.  The programmers you've hired to use it,
-however, probably are not.
+Short answer: No, Perl does not have a Year 2000 problem.  Yes, Perl is
+Y2K compliant (whatever that means).  The programmers you've hired to
+use it, however, probably are not.
+
+Long answer: The question belies a true understanding of the issue.
+Perl is just as Y2K compliant as your pencil--no more, and no less.
+Can you use your pencil to write a non-Y2K-compliant memo?  Of course
+you can.  Is that the pencil's fault?  Of course it isn't.
 
-Long answer: Perl is just as Y2K compliant as your pencil--no more,
-and no less.  The date and time functions supplied with perl (gmtime
-and localtime) supply adequate information to determine the year well
-beyond 2000 (2038 is when trouble strikes for 32-bit machines).  The
-year returned by these functions when used in an array context is the
-year minus 1900.  For years between 1910 and 1999 this I<happens> to
-be a 2-digit decimal number. To avoid the year 2000 problem simply do
-not treat the year as a 2-digit number.  It isn't.
+The date and time functions supplied with perl (gmtime and localtime)
+supply adequate information to determine the year well beyond 2000
+(2038 is when trouble strikes for 32-bit machines).  The year returned
+by these functions when used in an array context is the year minus 1900.
+For years between 1910 and 1999 this I<happens> to be a 2-digit decimal
+number. To avoid the year 2000 problem simply do not treat the year as
+a 2-digit number.  It isn't.
 
 When gmtime() and localtime() are used in scalar context they return
 a timestamp string that contains a fully-expanded year.  For example,
@@ -286,8 +345,9 @@ parser.
 If you are serious about writing a parser, there are a number of
 modules or oddities that will make your life a lot easier.  There is
 the CPAN module Parse::RecDescent, the standard module Text::Balanced,
-the byacc program, and Mark-Jason Dominus's excellent I<py> tool at
-http://www.plover.com/~mjd/perl/py/ .
+the byacc program, the CPAN module Parse::Yapp, and Mark-Jason
+Dominus's excellent I<py> tool at http://www.plover.com/~mjd/perl/py/
+.
 
 One simple destructive, inside-out approach that you might try is to
 pull out the smallest nesting parts one at a time:
@@ -296,6 +356,21 @@ pull out the smallest nesting parts one at a time:
        # do something with $1
     } 
 
+A more complicated and sneaky approach is to make Perl's regular
+expression engine do it for you.  This is courtesy Dean Inada, and
+rather has the nature of an Obfuscated Perl Contest entry, but it
+really does work:
+
+    # $_ contains the string to parse
+    # BEGIN and END are the opening and closing markers for the
+    # nested text.
+    @( = ('(','');
+    @) = (')','');
+    ($re=$_)=~s/((BEGIN)|(END)|.)/$)[!$3]\Q$1\E$([!$2]/gs;
+    @$ = (eval{/$re/},$@!~/unmatched/);
+    print join("\n",@$[0..$#$]) if( $$[-1] );
+
 =head2 How do I reverse a string?
 
 Use reverse() in scalar context, as documented in
@@ -422,6 +497,11 @@ You can (and probably should) enable locale awareness of those
 characters by placing a C<use locale> pragma in your program.
 See L<perllocale> for endless details on locales.
 
+This is sometimes referred to as putting something into "title
+case", but that's not quite accurate.  Consdier the proper
+capitalization of the movie I<Dr. Strangelove or: How I Learned to
+Stop Worrying and Love the Bomb>, for example.
+
 =head2 How can I split a [character] delimited string except when inside
 [character]? (Comma-separated files)
 
@@ -457,13 +537,15 @@ distribution) lets you say:
     use Text::ParseWords;
     @new = quotewords(",", 0, $text);
 
+There's also a Text::CSV module on CPAN.
+
 =head2 How do I strip blank space from the beginning/end of a string?
 
 Although the simplest approach would seem to be:
 
     $string =~ s/^\s*(.*?)\s*$/$1/;
 
-This is unneccesarily slow, destructive, and fails with embedded newlines.
+This is unnecessarily slow, destructive, and fails with embedded newlines.
 It is much better faster to do this in two steps:
 
     $string =~ s/^\s+//;
@@ -488,6 +570,44 @@ values of a hash if you use a slide:
         s/\s+$//;
     }
 
+=head2 How do I pad a string with blanks or pad a number with zeroes?
+
+(This answer contributed by Uri Guttman)
+
+In the following examples, C<$pad_len> is the length to which you wish
+to pad the string, C<$text> or C<$num> contains the string to be
+padded, and C<$pad_char> contains the padding character. You can use a
+single character string constant instead of the C<$pad_char> variable
+if you know what it is in advance.
+
+The simplest method use the C<sprintf> function. It can pad on the
+left or right with blanks and on the left with zeroes.
+
+    # Left padding with blank:
+    $padded = sprintf( "%${pad_len}s", $text ) ;
+
+    # Right padding with blank:
+    $padded = sprintf( "%${pad_len}s", $text ) ;
+
+    # Left padding with 0:
+    $padded = sprintf( "%0${pad_len}d", $num ) ;
+
+If you need to pad with a character other than blank or zero you can use
+one of the following methods.
+
+These methods generate a pad string with the C<x> operator and
+concatenate that with the original text.
+
+Left and right padding with any character:
+
+    $padded = $pad_char x ( $pad_len - length( $text ) ) . $text ;
+    $padded = $text . $pad_char x ( $pad_len - length( $text ) ) ;
+
+Or you can left or right pad $text directly:
+
+    $text .= $pad_char x ( $pad_len - length( $text ) ) ;
+    substr( $text, 0, 0 ) = $pad_char x ( $pad_len - length( $text ) ) ;
+
 =head2 How do I extract selected columns from a string?
 
 Use substr() or unpack(), both documented in L<perlfunc>.
@@ -523,13 +643,13 @@ Let's assume that you have a string like:
 If those were both global variables, then this would
 suffice:
 
-    $text =~ s/\$(\w+)/${$1}/g;
+    $text =~ s/\$(\w+)/${$1}/g;  # no /e needed
 
 But since they are probably lexicals, or at least, they could
 be, you'd have to do this:
 
     $text =~ s/(\$\w+)/$1/eeg;
-    die if $@;                 # needed on /ee, not /e
+    die if $@;                 # needed /ee, not /e
 
 It's probably better in the general case to treat those
 variables as entries in some special hash.  For example:
@@ -547,7 +667,9 @@ of the FAQ.
 
 The problem is that those double-quotes force stringification,
 coercing numbers and references into strings, even when you
-don't want them to be.
+don't want them to be.  Think of it this way: double-quote
+expansion is used to produce new strings.  If you already 
+have a string, why do you need more?
 
 If you get used to writing odd things like these:
 
@@ -583,7 +705,7 @@ Stringification also destroys arrays.
     print "@lines";            # WRONG - extra blanks
     print @lines;              # right
 
-=head2 Why don't my <<HERE documents work?
+=head2 Why don't my E<lt>E<lt>HERE documents work?
 
 Check for these three things:
 
@@ -665,6 +787,27 @@ indentation correctly preserved:
 
 =head1 Data: Arrays
 
+=head2 What is the difference between a list and an array?
+
+An array has a changeable length.  A list does not.  An array is something
+you can push or pop, while a list is a set of values.  Some people make
+the distinction that a list is a value while an array is a variable.
+Subroutines are passed and return lists, you put things into list
+context, you initialize arrays with lists, and you foreach() across
+a list.  C<@> variables are arrays, anonymous arrays are arrays, arrays
+in scalar context behave like the number of elements in them, subroutines
+access their arguments through the array C<@_>, push/pop/shift only work
+on arrays.
+
+As a side note, there's no such thing as a list in scalar context.
+When you say
+
+    $scalar = (2, 5, 7, 9);
+
+you're using the comma operator in scalar context, so it evaluates the
+left hand side, then evaluates and returns the left hand side.  This
+causes the last value to be returned: 9.
+
 =head2 What is the difference between $array[1] and @array[1]?
 
 The former is a scalar value, the latter an array slice, which makes
@@ -724,6 +867,8 @@ nice in that it won't work with false values like undef, 0, or "";
 
 =back
 
+But perhaps you should have been using a hash all along, eh?
+
 =head2 How can I tell whether a list or array contains a certain element?
 
 Hearing the word "in" is an I<in>dication that you probably should have
@@ -770,7 +915,17 @@ or worse yet
 
 These are slow (checks every element even if the first matches),
 inefficient (same reason), and potentially buggy (what if there are
-regexp characters in $whatever?).
+regexp characters in $whatever?).  If you're only testing once, then
+use:
+
+    $is_there = 0;
+    foreach $elt (@array) {
+       if ($elt eq $elt_to_find) {
+           $is_there = 1;
+           last;
+       }
+    }
+    if ($is_there) { ... }
 
 =head2 How do I compute the difference of two arrays?  How do I compute the intersection of two arrays?
 
@@ -785,11 +940,60 @@ each element is unique in a given array:
        push @{ $count{$element} > 1 ? \@intersection : \@difference }, $element;
     }
 
+=head2 How do I test whether two arrays or hashes are equal?
+
+The following code works for single-level arrays.  It uses a stringwise
+comparison, and does not distinguish defined versus undefined empty
+strings.  Modify if you have other needs.
+
+    $are_equal = compare_arrays(\@frogs, \@toads);
+
+    sub compare_arrays {
+       my ($first, $second) = @_;
+       local $^W = 0;  # silence spurious -w undef complaints
+       return 0 unless @$first == @$second;
+       for (my $i = 0; $i < @$first; $i++) {
+           return 0 if $first->[$i] ne $second->[$i];
+       }
+       return 1;
+    }
+
+For multilevel structures, you may wish to use an approach more
+like this one.  It uses the CPAN module FreezeThaw:
+
+    use FreezeThaw qw(cmpStr);
+    @a = @b = ( "this", "that", [ "more", "stuff" ] );
+
+    printf "a and b contain %s arrays\n",
+        cmpStr(\@a, \@b) == 0 
+           ? "the same" 
+           : "different";
+
+This approach also works for comparing hashes.  Here
+we'll demonstrate two different answers:
+
+    use FreezeThaw qw(cmpStr cmpStrHard);
+
+    %a = %b = ( "this" => "that", "extra" => [ "more", "stuff" ] );
+    $a{EXTRA} = \%b;
+    $b{EXTRA} = \%a;                    
+
+    printf "a and b contain %s hashes\n",
+       cmpStr(\%a, \%b) == 0 ? "the same" : "different";
+
+    printf "a and b contain %s hashes\n",
+       cmpStrHard(\%a, \%b) == 0 ? "the same" : "different";
+
+
+The first reports that both those the hashes contain the same data,
+while the second reports that they do not.  Which you prefer is left as
+an exercise to the reader.
+
 =head2 How do I find the first array element for which a condition is true?
 
 You can use this if you care about the index:
 
-    for ($i=0; $i < @array; $i++) {
+    for ($i= 0; $i < @array; $i++) {
         if ($array[$i] eq "Waldo") {
            $found_index = $i;
             last;
@@ -810,7 +1014,42 @@ need to copy pointers each time.
 
 If you really, really wanted, you could use structures as described in
 L<perldsc> or L<perltoot> and do just what the algorithm book tells you
-to do.
+to do.  For example, imagine a list node like this:
+
+    $node = {
+        VALUE => 42,
+        LINK  => undef,
+    };
+
+You could walk the list this way:
+
+    print "List: ";
+    for ($node = $head;  $node; $node = $node->{LINK}) {
+        print $node->{VALUE}, " ";
+    }
+    print "\n";
+
+You could grow the list this way:
+
+    my ($head, $tail);
+    $tail = append($head, 1);       # grow a new head
+    for $value ( 2 .. 10 ) {
+        $tail = append($tail, $value);
+    }
+
+    sub append {
+        my($list, $value) = @_;
+        my $node = { VALUE => $value };
+        if ($list) {
+            $node->{LINK} = $list->{LINK};
+            $list->{LINK} = $node;
+        } else {
+            $_[0] = $node;      # replace caller's version
+        }
+        return $node;
+    }
+
+But again, Perl's built-in are virtually always good enough.
 
 =head2 How do I handle circular lists?
 
@@ -1006,9 +1245,54 @@ get those bits into your @ints array:
 This method gets faster the more sparse the bit vector is.
 (Courtesy of Tim Bunce and Winfried Koenig.)
 
+Here's a demo on how to use vec():
+
+    # vec demo
+    $vector = "\xff\x0f\xef\xfe";
+    print "Ilya's string \\xff\\x0f\\xef\\xfe represents the number ", 
+       unpack("N", $vector), "\n";
+    $is_set = vec($vector, 23, 1);
+    print "Its 23rd bit is ", $is_set ? "set" : "clear", ".\n";
+    pvec($vector);
+
+    set_vec(1,1,1);
+    set_vec(3,1,1);
+    set_vec(23,1,1);
+
+    set_vec(3,1,3);
+    set_vec(3,2,3);
+    set_vec(3,4,3);
+    set_vec(3,4,7);
+    set_vec(3,8,3);
+    set_vec(3,8,7);
+
+    set_vec(0,32,17);
+    set_vec(1,32,17);
+
+    sub set_vec { 
+       my ($offset, $width, $value) = @_;
+       my $vector = '';
+       vec($vector, $offset, $width) = $value;
+       print "offset=$offset width=$width value=$value\n";
+       pvec($vector);
+    }
+
+    sub pvec {
+       my $vector = shift;
+       my $bits = unpack("b*", $vector);
+       my $i = 0;
+       my $BASE = 8;
+
+       print "vector length in bytes: ", length($vector), "\n";
+       @bytes = unpack("A8" x length($vector), $bits);
+       print "bits are: @bytes\n\n";
+    } 
+
 =head2 Why does defined() return true on empty arrays and hashes?
 
-See L<perlfunc/defined> in the 5.004 release or later of Perl.
+The short story is that you should probably only use defined on scalars or
+functions, not on aggregates (arrays and hashes).  See L<perlfunc/defined>
+in the 5.004 release or later of Perl for more detail.
 
 =head1 Data: Hashes (Associative Arrays)
 
@@ -1243,9 +1527,21 @@ awk's behavior.
 
 =head2 How can I make the Perl equivalent of a C structure/C++ class/hash or array of hashes or arrays?
 
-Use references (documented in L<perlref>).  Examples of complex data
-structures are given in L<perldsc> and L<perllol>.  Examples of
-structures and object-oriented classes are in L<perltoot>.
+Usually a hash ref, perhaps like this:
+
+    $record = {
+        NAME   => "Jason",
+        EMPNO  => 132,
+        TITLE  => "deputy peon",
+        AGE    => 23,
+        SALARY => 37_000,
+        PALS   => [ "Norbert", "Rhys", "Phineas"],
+    };
+
+References are documented in L<perlref> and the upcoming L<perlreftut>.
+Examples of complex data structures are given in L<perldsc> and
+L<perllol>.  Examples of structures and object-oriented classes are
+in L<perltoot>.
 
 =head2 How can I use a reference as a hash key?
 
@@ -1263,8 +1559,9 @@ this works fine (assuming the files are found):
        print "Your kernel is GNU-zip enabled!\n";
     }
 
-On some systems, however, you have to play tedious games with "text"
-versus "binary" files.  See L<perlfunc/"binmode">.
+On some legacy systems, however, you have to play tedious games with
+"text" versus "binary" files.  See L<perlfunc/"binmode">, or the upcoming
+L<perlopentut> manpage.
 
 If you're concerned about 8-bit ASCII data, then see L<perllocale>.
 
@@ -1276,14 +1573,14 @@ some gotchas.  See the section on Regular Expressions.
 Assuming that you don't care about IEEE notations like "NaN" or
 "Infinity", you probably just want to use a regular expression.
 
-   warn "has nondigits"        if     /\D/;
-    warn "not a natural number" unless /^\d+$/;             # rejects -3
-    warn "not an integer"       unless /^-?\d+$/;           # rejects +3
-   warn "not an integer"       unless /^[+-]?\d+$/;
-   warn "not a decimal number" unless /^-?\d+\.?\d*$/;  # rejects .2
-   warn "not a decimal number" unless /^-?(?:\d+(?:\.\d*)?|\.\d+)$/;
-   warn "not a C float"
-       unless /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/;
+   if (/\D/)            { print "has nondigits\n" }
+   if (/^\d+$/)         { print "is a whole number\n" }
+   if (/^-?\d+$/)       { print "is an integer\n" }
+   if (/^[+-]?\d+$/)    { print "is a +/- integer\n" }
+   if (/^-?\d+\.?\d*$/) { print "is a real number\n" }
+   if (/^-?(?:\d+(?:\.\d*)?|\.\d+)$/) { print "is a decimal number" }
+   if (/^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/)
+                       { print "a C float" }
 
 If you're on a POSIX system, Perl's supports the C<POSIX::strtod>
 function.  Its semantics are somewhat cumbersome, so here's a C<getnum>
@@ -1317,19 +1614,32 @@ and longs, respectively.
 =head2 How do I keep persistent data across program calls?
 
 For some specific applications, you can use one of the DBM modules.
-See L<AnyDBM_File>.  More generically, you should consult the
-FreezeThaw, Storable, or Class::Eroot modules from CPAN.
+See L<AnyDBM_File>.  More generically, you should consult the FreezeThaw,
+Storable, or Class::Eroot modules from CPAN.  Here's one example using
+Storable's C<store> and C<retrieve> functions:
+
+    use Storable; 
+    store(\%hash, "filename");
+
+    # later on...  
+    $href = retrieve("filename");        # by ref
+    %hash = %{ retrieve("filename") };   # direct to hash
 
 =head2 How do I print out or copy a recursive data structure?
 
-The Data::Dumper module on CPAN is nice for printing out
-data structures, and FreezeThaw for copying them.  For example:
+The Data::Dumper module on CPAN (or the 5.005 release of Perl) is great
+for printing out data structures.  The Storable module, found on CPAN,
+provides a function called C<dclone> that recursively copies its argument.
+
+    use Storable qw(dclone); 
+    $r2 = dclone($r1);
 
-    use FreezeThaw qw(freeze thaw);
-    ($new) = thaw freeze $old;
+Where $r1 can be a reference to any kind of data structure you'd like.
+It will be deeply copied.  Because C<dclone> takes and returns references,
+you'd have to add extra punctuation if you had a hash of arrays that
+you wanted to copy.
 
-Where $old can be (a reference to) any kind of data structure you'd like.
-It will be deeply copied.
+    %newhash = %{ dclone(\%oldhash) };
 
 =head2 How do I define methods for every class/object?
 
@@ -1339,9 +1649,15 @@ Use the UNIVERSAL class (see L<UNIVERSAL>).
 
 Get the Business::CreditCard module from CPAN.
 
+=head2 How do I pack arrays of doubles or floats for XS code?
+
+The kgbpack.c code in the PGPLOT module on CPAN does just this.
+If you're doing a lot of float or double processing, consider using
+the PDL module from CPAN instead--it makes number-crunching easy.
+
 =head1 AUTHOR AND COPYRIGHT
 
-Copyright (c) 1997, 1998 Tom Christiansen and Nathan Torkington.
+Copyright (c) 1997-1999 Tom Christiansen and Nathan Torkington.
 All rights reserved.
 
 When included as part of the Standard Version of Perl, or as part of
@@ -1356,3 +1672,4 @@ are hereby placed into the public domain.  You are permitted and
 encouraged to use this code in your own programs for fun
 or for profit as you see fit.  A simple comment in the code giving
 credit would be courteous but is not required.
+
index 3e1103b..119ffa4 100644 (file)
@@ -1,6 +1,6 @@
 =head1 NAME
 
-perlfaq5 - Files and Formats ($Revision: 1.24 $, $Date: 1998/07/05 15:07:20 $)
+perlfaq5 - Files and Formats ($Revision: 1.34 $, $Date: 1999/01/08 05:46:13 $)
 
 =head1 DESCRIPTION
 
@@ -78,12 +78,15 @@ See L<perlfaq9> for other examples of fetching URLs over the web.
 
 =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?
 
+Those are operations of a text editor.  Perl is not a text editor.
+Perl is a programming language.  You have to decompose the problem into
+low-level calls to read, write, open, close, and seek.
+
 Although humans have an easy time thinking of a text file as being a
-sequence of lines that operates much like a stack of playing cards --
-or punch cards -- computers usually see the text file as a sequence of
-bytes.  In general, there's no direct way for Perl to seek to a
-particular line of a file, insert text into a file, or remove text
-from a file.
+sequence of lines that operates much like a stack of playing cards -- or
+punch cards -- computers usually see the text file as a sequence of bytes.
+In general, there's no direct way for Perl to seek to a particular line
+of a file, insert text into a file, or remove text from a file.
 
 (There are exceptions in special circumstances.  You can add or remove at
 the very end of the file.  Another is replacing a sequence of bytes with
@@ -97,7 +100,7 @@ no locking.
 
     $old = $file;
     $new = "$file.tmp.$$";
-    $bak = "$file.bak";
+    $bak = "$file.orig";
 
     open(OLD, "< $old")        or die "can't open $old: $!";
     open(NEW, "> $new")        or die "can't open $new: $!";
@@ -124,7 +127,7 @@ platform-specific documentation that came with your port.
     perl -pi -e 's/(^\s+test\s+)\d+/ $1 . ++$count /e' t/op/taint.t
 
     # form a script
-    local($^I, @ARGV) = ('.bak', glob("*.c"));
+    local($^I, @ARGV) = ('.orig', glob("*.c"));
     while (<>) {
        if ($. == 1) {
            print "This line should appear at the top of each file\n";
@@ -174,9 +177,9 @@ Use the C<new_tmpfile> class method from the IO::File module to get a
 filehandle opened for reading and writing.  Use this if you don't
 need to know the file's name.
 
-       use IO::File;
+    use IO::File;
     $fh = IO::File->new_tmpfile()
-            or die "Unable to make new temporary file: $!";
+       or die "Unable to make new temporary file: $!";
 
 Or you can use the C<tmpnam> function from the POSIX module to get a
 filename that you then open yourself.  Use this if you do need to know
@@ -222,7 +225,7 @@ one process, use a counter:
 =head2 How can I manipulate fixed-record-length files?
 
 The most efficient way is using pack() and unpack().  This is faster than
-using substr() when take many, many strings.  It is slower for just a few.
+using substr() when taking many, many strings.  It is slower for just a few.
 
 Here is a sample chunk of code to break up and put back together again
 some fixed-format input lines, in this case from the output of a normal,
@@ -289,10 +292,10 @@ pair to make it easy to sort the hash in insertion order.
     }
 
 For passing filehandles to functions, the easiest way is to 
-prefer them with a star, as in func(*STDIN).
-See L<perlfaq7/"Passing Filehandles"> for details.
+preface them with a star, as in func(*STDIN).  See L<perlfaq7/"Passing
+Filehandles"> for details.
 
-If you want to create many, anonymous handles, you should check out the
+If you want to create many anonymous handles, you should check out the
 Symbol, FileHandle, or IO::Handle (etc.) modules.  Here's the equivalent
 code with Symbol::gensym, which is reasonably light-weight:
 
@@ -303,8 +306,8 @@ code with Symbol::gensym, which is reasonably light-weight:
         $file{$filename} = [ $i++, $fh ];
     }
 
-Or here using the semi-object-oriented FileHandle, which certainly isn't
-light-weight:
+Or here using the semi-object-oriented FileHandle module, which certainly
+isn't light-weight:
 
     use FileHandle;
 
@@ -344,7 +347,7 @@ Then use any of those as you would a normal filehandle.  Anywhere that
 Perl is expecting a filehandle, an indirect filehandle may be used
 instead. An indirect filehandle is just a scalar variable that contains
 a filehandle.  Functions like C<print>, C<open>, C<seek>, or
-the C<E<lt>FHE<gt>> diamond operator will accept either a real filehandle
+the C<E<lt>FHE<gt>> diamond operator will accept either a read filehandle
 or a scalar variable containing one:
 
     ($ifh, $ofh, $efh) = (*STDIN, *STDOUT, *STDERR);
@@ -422,7 +425,7 @@ techniques to make it possible for the intrepid hacker.
 
 =head2 How can I write() into a string?
 
-See L<perlform> for an swrite() function.
+See L<perlform/"Accessing Formatting Internals"> for an swrite() function.
 
 =head2 How can I output my numbers with commas added?
 
@@ -430,7 +433,7 @@ This one will do it for you:
 
     sub commify {
        local $_  = shift;
-       1 while s/^(-?\d+)(\d{3})/$1,$2/;
+       1 while s/^([-+]?\d+)(\d{3})/$1,$2/;
        return $_;
     }
 
@@ -441,7 +444,7 @@ This one will do it for you:
 
 You can't just:
 
-    s/^(-?\d+)(\d{3})/$1,$2/g;
+    s/^([-+]?\d+)(\d{3})/$1,$2/g;
 
 because you have to put the comma in and then recalculate your
 position.
@@ -455,7 +458,7 @@ whatever:
        my $input = shift;
         $input = reverse $input;
         $input =~ s<(\d\d\d)(?=\d)(?!\d*\.)><$1,>g;
-        return reverse $input;
+        return scalar reverse $input;
     }
 
 =head2 How can I translate tildes (~) in a filename?
@@ -547,7 +550,9 @@ be an atomic operation over NFS.  That is, two processes might both
 successful create or unlink the same file!  Therefore O_EXCL
 isn't so exclusive as you might wish.
 
-=head2 Why do I sometimes get an "Argument list too long" when I use <*>?
+See also the new L<perlopentut> if you have it (new for 5.006).
+
+=head2 Why do I sometimes get an "Argument list too long" when I use E<lt>*E<gt>?
 
 The C<E<lt>E<gt>> operator performs a globbing operation (see above).
 By default glob() forks csh(1) to do the actual glob expansion, but
@@ -555,9 +560,9 @@ csh can't handle more than 127 items and so gives the error message
 C<Argument list too long>.  People who installed tcsh as csh won't
 have this problem, but their users may be surprised by it.
 
-To get around this, either do the glob yourself with C<Dirhandle>s and
+To get around this, either do the glob yourself with readdir() and
 patterns, or use a module like Glob::KGlob, one that doesn't use the
-shell to do globbing.
+shell to do globbing.  This is expected to be fixed soon.
 
 =head2 Is there a leak/bug in glob()?
 
@@ -576,15 +581,28 @@ trailing null byte on the name to make perl leave it alone:
 
     sub safe_filename {
        local $_  = shift;
-       return m#^/#
-               ? "$_\0"
-               : "./$_\0";
+        s#^([^./])#./$1#;
+        $_ .= "\0";
+       return $_;
     }
 
-    $fn = safe_filename("<<<something really wicked   ");
-    open(FH, "> $fn") or "couldn't open $fn: $!";
+    $badpath = "<<<something really wicked   ";
+    $fn = safe_filename($badpath");
+    open(FH, "> $fn") or "couldn't open $badpath: $!";
+
+This assumes that you are using POSIX (portable operating systems
+interface) paths.  If you are on a closed, non-portable, proprietary
+system, you may have to adjust the C<"./"> above.
+
+It would be a lot clearer to use sysopen(), though:
+
+    use Fcntl;
+    $badpath = "<<<something really wicked   ";
+    open (FH, $badpath, O_WRONLY | O_CREAT | O_TRUNC)
+       or die "can't open $badpath: $!";
 
-You could also use the sysopen() function (see L<perlfunc/sysopen>).
+For more information, see also the new L<perlopentut> if you have it
+(new for 5.006).
 
 =head2 How can I reliably rename a file?
 
@@ -601,7 +619,7 @@ then delete the old one.  This isn't really the same semantics as a
 real rename(), though, which preserves metainformation like
 permissions, timestamps, inode info, etc.
 
-The newer version of File::Copy export a move() function.
+The newer version of File::Copy exports a move() function.
 
 =head2 How can I lock a file?
 
@@ -631,9 +649,12 @@ build Perl.  See the flock entry of L<perlfunc>, and the F<INSTALL>
 file in the source distribution for information on building Perl to do
 this.
 
+For more information on file locking, see also L<perlopentut/"File
+Locking"> if you have it (new for 5.006).
+
 =back
 
-=head2 What can't I just open(FH, ">file.lock")?
+=head2 Why can't I just open(FH, ">file.lock")?
 
 A common bit of code B<NOT TO USE> is this:
 
@@ -649,7 +670,7 @@ atomic test-and-set instruction.   In theory, this "ought" to work:
 
 except that lamentably, file creation (and deletion) is not atomic
 over NFS, so this won't work (at least, not every time) over the net.
-Various schemes involving involving link() have been suggested, but
+Various schemes involving link() have been suggested, but
 these tend to involve busy-wait, which is also subdesirable.
 
 =head2 I still don't get locking.  I just want to increment the number in the file.  How can I do this?
@@ -661,14 +682,15 @@ It's more realistic.
 
 Anyway, this is what you can do if you can't help yourself.
 
-    use Fcntl;
+    use Fcntl ':flock';
     sysopen(FH, "numfile", O_RDWR|O_CREAT)      or die "can't open numfile: $!";
-    flock(FH, 2)                                or die "can't flock numfile: $!";
+    flock(FH, LOCK_EX)                                  or die "can't flock numfile: $!";
     $num = <FH> || 0;
     seek(FH, 0, 0)                              or die "can't rewind numfile: $!";
     truncate(FH, 0)                             or die "can't truncate numfile: $!";
     (print FH $num+1, "\n")                     or die "can't write numfile: $!";
-    # DO NOT UNLOCK THIS UNTIL YOU CLOSE
+    # Perl as of 5.004 automatically flushes before unlocking
+    flock(FH, LOCK_UN)                                  or die "can't flock numfile: $!";
     close FH                                    or die "can't close numfile: $!";
 
 Here's a much better web-page hit counter:
@@ -693,7 +715,7 @@ like this:
     seek(FH, $recno * $RECSIZE, 0);
     read(FH, $record, $RECSIZE) == $RECSIZE || die "can't read record $recno: $!";
     # munge the record
-    seek(FH, $recno * $RECSIZE, 0);
+    seek(FH, -$RECSIZE, 1);
     print FH $record;
     close FH;
 
@@ -720,12 +742,15 @@ Here's an example:
 If you prefer something more legible, use the File::stat module
 (part of the standard distribution in version 5.004 and later):
 
+    # error checking left as an exercise for reader.
     use File::stat;
     use Time::localtime;
     $date_string = ctime(stat($file)->mtime);
     print "file $file updated at $date_string\n";
 
-Error checking is left as an exercise for the reader.
+The POSIX::strftime() approach has the benefit of being,
+in theory, independent of the current locale.  See L<perllocale>
+for details.
 
 =head2 How do I set a file's timestamp in perl?
 
@@ -741,7 +766,7 @@ of them.
     ($atime, $mtime) = (stat($timestamp))[8,9];
     utime $atime, $mtime, @ARGV;
 
-Error checking is left as an exercise for the reader.
+Error checking is, as usual, left as an exercise for the reader.
 
 Note that utime() currently doesn't work correctly with Win95/NT
 ports.  A bug has been reported.  Check it carefully before using
@@ -774,11 +799,14 @@ than the stock version.
 
 =head2 How can I read in a file by paragraphs?
 
-Use the C<$\> variable (see L<perlvar> for details).  You can either
+Use the C<$/> variable (see L<perlvar> for details).  You can either
 set it to C<""> to eliminate empty paragraphs (C<"abc\n\n\n\ndef">,
 for instance, gets treated as two paragraphs and not three), or
 C<"\n\n"> to accept empty paragraphs.
 
+Note that a blank line must have no blanks in it.  Thus C<"fred\n
+\nstuff\n\n"> is one paragraph, but C<"fred\n\nstuff\n\n"> is two.
+
 =head2 How can I read a single character from a file?  From the keyboard?
 
 You can use the builtin C<getc()> function for most filehandles, but
@@ -786,8 +814,9 @@ it won't (easily) work on a terminal device.  For STDIN, either use
 the Term::ReadKey module from CPAN, or use the sample code in
 L<perlfunc/getc>.
 
-If your system supports POSIX, you can use the following code, which
-you'll note turns off echo processing as well.
+If your system supports the portable operating system programming
+interface (POSIX), you can use the following code, which you'll note
+turns off echo processing as well.
 
     #!/usr/bin/perl -w
     use strict;
@@ -838,7 +867,8 @@ you'll note turns off echo processing as well.
 
     END { cooked() }
 
-The Term::ReadKey module from CPAN may be easier to use:
+The Term::ReadKey module from CPAN may be easier to use.  Recent version
+include also support for non-portable systems as well.
 
     use Term::ReadKey;
     open(TTY, "</dev/tty");
@@ -849,7 +879,7 @@ The Term::ReadKey module from CPAN may be easier to use:
     printf "\nYou said %s, char number %03d\n",
         $key, ord $key;
 
-For DOS systems, Dan Carson <dbc@tc.fluke.COM> reports the following:
+For legacy DOS systems, Dan Carson <dbc@tc.fluke.COM> reports the following:
 
 To put the PC in "raw" mode, use ioctl with some magic numbers gleaned
 from msdos.c (Perl source file) and Ralf Brown's interrupt list (comes
@@ -895,11 +925,12 @@ table:
 This is all trial and error I did a long time ago, I hope I'm reading the
 file that worked.
 
-=head2 How can I tell if there's a character waiting on a filehandle?
+=head2 How can I tell whether there's a character waiting on a filehandle?
 
 The very first thing you should do is look into getting the Term::ReadKey
-extension from CPAN.  It now even has limited support for closed, proprietary
-(read: not open systems, not POSIX, not Unix, etc) systems.
+extension from CPAN.  As we mentioned earlier, it now even has limited
+support for non-portable (read: not open systems, closed, proprietary,
+not POSIX, not Unix, etc) systems.
 
 You should also check out the Frequently Asked Questions list in
 comp.unix.* for things like this: the answer is essentially the same.
@@ -912,12 +943,11 @@ systems:
        return $nfd = select($rin,undef,undef,0);
     }
 
-If you want to find out how many characters are waiting,
-there's also the FIONREAD ioctl call to be looked at.
-
-The I<h2ph> tool that comes with Perl tries to convert C include
-files to Perl code, which can be C<require>d.  FIONREAD ends
-up defined as a function in the I<sys/ioctl.ph> file:
+If you want to find out how many characters are waiting, there's
+also the FIONREAD ioctl call to be looked at.  The I<h2ph> tool that
+comes with Perl tries to convert C include files to Perl code, which
+can be C<require>d.  FIONREAD ends up defined as a function in the
+I<sys/ioctl.ph> file:
 
     require 'sys/ioctl.ph';
 
@@ -939,7 +969,7 @@ Or write a small C program using the editor of champions:
         printf("%#08x\n", FIONREAD);
     }
     ^D
-    % cc -o fionread fionread
+    % cc -o fionread fionread.c
     % ./fionread
     0x4004667f
 
@@ -980,6 +1010,8 @@ the clearerr() method, which can remove the end of file condition on a
 filehandle.  The method: read until end of file, clearerr(), read some
 more.  Lather, rinse, repeat.
 
+There's also a File::Tail module from CPAN.
+
 =head2 How do I dup() a filehandle in Perl?
 
 If you check L<perlfunc/open>, you'll see that several of the ways
@@ -1018,19 +1050,22 @@ Remember that within double quoted strings ("like\this"), the
 backslash is an escape character.  The full list of these is in
 L<perlop/Quote and Quote-like Operators>.  Unsurprisingly, you don't
 have a file called "c:(tab)emp(formfeed)oo" or
-"c:(tab)emp(formfeed)oo.exe" on your DOS filesystem.
+"c:(tab)emp(formfeed)oo.exe" on your legacy DOS filesystem.
 
 Either single-quote your strings, or (preferably) use forward slashes.
 Since all DOS and Windows versions since something like MS-DOS 2.0 or so
 have treated C</> and C<\> the same in a path, you might as well use the
 one that doesn't clash with Perl -- or the POSIX shell, ANSI C and C++,
-awk, Tcl, Java, or Python, just to mention a few.
+awk, Tcl, Java, or Python, just to mention a few.  POSIX paths
+are more portable, too.
 
 =head2 Why doesn't glob("*.*") get all the files?
 
 Because even on non-Unix ports, Perl's glob function follows standard
 Unix globbing semantics.  You'll need C<glob("*")> to get all (non-hidden)
-files.  This makes glob() portable.
+files.  This makes glob() portable even to legacy systems.  Your
+port may include proprietary globbing functions as well.  Check its
+documentation for details.
 
 =head2 Why does Perl let me delete read-only files?  Why does C<-i> clobber protected files?  Isn't this a bug in Perl?
 
@@ -1057,9 +1092,32 @@ This has a significant advantage in space over reading the whole
 file in.  A simple proof by induction is available upon 
 request if you doubt its correctness.
 
+=head2 Why do I get weird spaces when I print an array of lines?
+
+Saying
+
+    print "@lines\n";
+
+joins together the elements of C<@lines> with a space between them.
+If C<@lines> were C<("little", "fluffy", "clouds")> then the above
+statement would print:
+
+    little fluffy clouds
+
+but if each element of C<@lines> was a line of text, ending a newline
+character C<("little\n", "fluffy\n", "clouds\n")> then it would print:
+
+    little
+     fluffy
+     clouds
+
+If your array contains lines, just print them:
+
+    print @lines;
+
 =head1 AUTHOR AND COPYRIGHT
 
-Copyright (c) 1997, 1998 Tom Christiansen and Nathan Torkington.
+Copyright (c) 1997-1999 Tom Christiansen and Nathan Torkington.
 All rights reserved.
 
 When included as an integrated part of the Standard Distribution
@@ -1072,3 +1130,4 @@ domain.  You are permitted and encouraged to use this code and any
 derivatives thereof in your own programs for fun or for profit as you
 see fit.  A simple comment in the code giving credit to the FAQ would
 be courteous but is not required.
+
index 488a27c..834fd89 100644 (file)
@@ -1,6 +1,6 @@
 =head1 NAME
 
-perlfaq6 - Regexps ($Revision: 1.22 $, $Date: 1998/07/16 14:01:07 $)
+perlfaq6 - Regexps ($Revision: 1.25 $, $Date: 1999/01/08 04:50:47 $)
 
 =head1 DESCRIPTION
 
@@ -128,7 +128,7 @@ L<perlop>):
 
 If you wanted text and not lines, you would use
 
-    perl -0777 -pe 'print "$1\n" while /START(.*?)END/gs' file1 file2 ...
+    perl -0777 -ne 'print "$1\n" while /START(.*?)END/gs' file1 file2 ...
 
 But if you want nested occurrences of C<START> through C<END>, you'll
 run up against the problem described in the question in this section
@@ -387,48 +387,31 @@ See the module String::Approx available from CPAN.
 
 =head2 How do I efficiently match many regular expressions at once?
 
-The following is super-inefficient:
+The following is extremely inefficient:
 
-    while (<FH>) {
-        foreach $pat (@patterns) {
-            if ( /$pat/ ) {
-                # do something
-            }
-        }
-    }
-
-Instead, you either need to use one of the experimental Regexp extension
-modules from CPAN (which might well be overkill for your purposes),
-or else put together something like this, inspired from a routine
-in Jeffrey Friedl's book:
-
-    sub _bm_build {
-        my $condition = shift;
-        my @regexp = @_;  # this MUST not be local(); need my()
-        my $expr = join $condition => map { "m/\$regexp[$_]/o" } (0..$#regexp);
-        my $match_func = eval "sub { $expr }";
-        die if $@;  # propagate $@; this shouldn't happen!
-        return $match_func;
-    }
-
-    sub bm_and { _bm_build('&&', @_) }
-    sub bm_or  { _bm_build('||', @_) }
-
-    $f1 = bm_and qw{
-            xterm
-            (?i)window
-    };
-
-    $f2 = bm_or qw{
-            \b[Ff]ree\b
-            \bBSD\B
-            (?i)sys(tem)?\s*[V5]\b
-    };
-
-    # feed me /etc/termcap, prolly
-    while ( <> ) {
-        print "1: $_" if &$f1;
-        print "2: $_" if &$f2;
+    # slow but obvious way
+    @popstates = qw(CO ON MI WI MN);
+    while (defined($line = <>)) {
+       for $state (@popstates) {
+           if ($line =~ /\b$state\b/i) {  
+               print $line;
+               last;
+           }
+       }
+    }                                        
+
+That's because Perl has to recompile all those patterns for each of
+the lines of the file.  As of the 5.005 release, there's a much better
+approach, one which makes use of the new C<qr//> operator:
+
+    # use spiffy new qr// operator, with /i flag even
+    use 5.005;
+    @popstates = qw(CO ON MI WI MN);
+    @poppats   = map { qr/\b$_\b/i } @popstates;
+    while (defined($line = <>)) {
+       for $patobj (@poppats) {
+           print $line if $line =~ /$patobj/;
+       }
     }
 
 =head2 Why don't word-boundary searches with C<\b> work for me?
@@ -460,22 +443,24 @@ not "this" or "island".
 
 =head2 Why does using $&, $`, or $' slow my program down?
 
-Because once Perl sees that you need one of these variables anywhere
-in the program, it has to provide them on each and every pattern
-match.  The same mechanism that handles these provides for the use of
-$1, $2, etc., so you pay the same price for each regexp that contains
-capturing parentheses. But if you never use $&, etc., in your script,
-then regexps I<without> capturing parentheses won't be penalized. So
-avoid $&, $', and $` if you can, but if you can't (and some algorithms
-really appreciate them), once you've used them once, use them at will,
-because you've already paid the price.
+Because once Perl sees that you need one of these variables anywhere in
+the program, it has to provide them on each and every pattern match.
+The same mechanism that handles these provides for the use of $1, $2,
+etc., so you pay the same price for each regexp that contains capturing
+parentheses. But if you never use $&, etc., in your script, then regexps
+I<without> capturing parentheses won't be penalized. So avoid $&, $',
+and $` if you can, but if you can't, once you've used them at all, use
+them at will because you've already paid the price.  Remember that some
+algorithms really appreciate them.  As of the 5.005 release.  the $&
+variable is no longer "expensive" the way the other two are.
 
 =head2 What good is C<\G> in a regular expression?
 
 The notation C<\G> is used in a match or substitution in conjunction the
 C</g> modifier (and ignored if there's no C</g>) to anchor the regular
 expression to the point just past where the last match occurred, i.e. the
-pos() point.
+pos() point.  A failed match resets the position of C<\G> unless the
+C</c> modifier is in effect.
 
 For example, suppose you had a line of text quoted in standard mail
 and Usenet notation, (that is, with leading C<E<gt>> characters), and
@@ -596,20 +581,41 @@ Or like this:
 
 Or like this:
 
-   die "sorry, Perl doesn't (yet) have Martian support )-:\n";
-
-In addition, a sample program which converts half-width to full-width
-katakana (in Shift-JIS or EUC encoding) is available from CPAN as
-
-=for Tom make it so
+    die "sorry, Perl doesn't (yet) have Martian support )-:\n";
 
 There are many double- (and multi-) byte encodings commonly used these
 days.  Some versions of these have 1-, 2-, 3-, and 4-byte characters,
 all mixed.
 
+=head2 How do I match a pattern that is supplied by the user?
+
+Well, if it's really a pattern, then just use
+
+    chomp($pattern = <STDIN>);
+    if ($line =~ /$pattern/) { }
+
+Or, since you have no guarantee that your user entered
+a valid regular expression, trap the exception this way:
+
+    if (eval { $line =~ /$pattern/ }) { }
+
+But if all you really want to search for a string, not a pattern,
+then you should either use the index() function, which is made for
+string searching, or if you can't be disabused of using a pattern
+match on a non-pattern, then be sure to use C<\Q>...C<\E>, documented
+in L<perlre>.
+
+    $pattern = <STDIN>;
+
+    open (FILE, $input) or die "Couldn't open input $input: $!; aborting";
+    while (<FILE>) {
+       print if /\Q$pattern\E/;
+    }
+    close FILE;
+
 =head1 AUTHOR AND COPYRIGHT
 
-Copyright (c) 1997, 1998 Tom Christiansen and Nathan Torkington.
+Copyright (c) 1997-1999 Tom Christiansen and Nathan Torkington.
 All rights reserved.
 
 When included as part of the Standard Version of Perl, or as part of
@@ -624,3 +630,4 @@ are hereby placed into the public domain.  You are permitted and
 encouraged to use this code in your own programs for fun
 or for profit as you see fit.  A simple comment in the code giving
 credit would be courteous but is not required.
+
index 07a6570..5794bfe 100644 (file)
@@ -1,6 +1,6 @@
 =head1 NAME
 
-perlfaq7 - Perl Language Issues ($Revision: 1.21 $, $Date: 1998/06/22 15:20:07 $)
+perlfaq7 - Perl Language Issues ($Revision: 1.24 $, $Date: 1999/01/08 05:32:11 $)
 
 =head1 DESCRIPTION
 
@@ -180,7 +180,7 @@ own module.  Make sure to change the names appropriately.
 
        # if using RCS/CVS, this next line may be preferred,
        # but beware two-digit versions.
-       $VERSION = do{my@r=q$Revision: 1.21 $=~/\d+/g;sprintf '%d.'.'%02d'x$#r,@r};
+       $VERSION = do{my@r=q$Revision: 1.24 $=~/\d+/g;sprintf '%d.'.'%02d'x$#r,@r};
 
        @ISA         = qw(Exporter);
        @EXPORT      = qw(&func1 &func2 &func3);
@@ -229,6 +229,10 @@ own module.  Make sure to change the names appropriately.
 
     1;            # modules must return true
 
+The h2xs program will create stubs for all the important stuff for you:
+
+  % h2xs -XA -n My::Module
+
 =head2 How do I create a class?
 
 See L<perltoot> for an introduction to classes and objects, as well as
@@ -344,7 +348,7 @@ reference to an existing or anonymous variable or function:
 
     func( \$some_scalar );
 
-    func( \$some_array  );
+    func( \@some_array  );
     func( [ 1 .. 10 ]   );
 
     func( \%some_hash   );
@@ -392,7 +396,7 @@ If you're planning on generating new filehandles, you could do this:
 To pass regexps around, you'll need to either use one of the highly
 experimental regular expression modules from CPAN (Nick Ing-Simmons's
 Regexp or Ilya Zakharevich's Devel::Regexp), pass around strings
-and use an exception-trapping eval, or else be be very, very clever.
+and use an exception-trapping eval, or else be very, very clever.
 Here's an example of how to pass in a string to be regexp compared:
 
     sub compare($$) {
@@ -563,7 +567,7 @@ However, dynamic variables (aka global, local, or package variables)
 are effectively shallowly bound.  Consider this just one more reason
 not to use them.  See the answer to L<"What's a closure?">.
 
-=head2 Why doesn't "my($foo) = <FILE>;" work right?
+=head2 Why doesn't "my($foo) = E<lt>FILEE<gt>;" work right?
 
 C<my()> and C<local()> give list context to the right hand side
 of C<=>.  The E<lt>FHE<gt> read operation, like so many of Perl's
@@ -594,7 +598,7 @@ Why do you want to do that? :-)
 If you want to override a predefined function, such as open(),
 then you'll have to import the new definition from a different
 module.  See L<perlsub/"Overriding Builtin Functions">.  There's
-also an example in L<perltoot/"Class::Struct">.
+also an example in L<perltoot/"Class::Template">.
 
 If you want to overload a Perl operator, such as C<+> or C<**>,
 then you'll want to use the C<use overload> pragma, documented
@@ -797,9 +801,34 @@ This can't go just anywhere.  You have to put a pod directive where
 the parser is expecting a new statement, not just in the middle
 of an expression or some other arbitrary yacc grammar production.
 
+=head2 How do I clear a package?
+
+Use this code, provided by Mark-Jason Dominus:
+
+    sub scrub_package {
+       no strict 'refs';
+       my $pack = shift;
+       die "Shouldn't delete main package" 
+           if $pack eq "" || $pack eq "main";
+       my $stash = *{$pack . '::'}{HASH};
+       my $name;
+       foreach $name (keys %$stash) {
+           my $fullname = $pack . '::' . $name;
+           # Get rid of everything with that name.
+           undef $$fullname;
+           undef @$fullname;
+           undef %$fullname;
+           undef &$fullname;
+           undef *$fullname;
+       }
+    }
+
+Or, if you're using a recent release of Perl, you can 
+just use the Symbol::delete_package() function instead.
+
 =head1 AUTHOR AND COPYRIGHT
 
-Copyright (c) 1997, 1998 Tom Christiansen and Nathan Torkington.
+Copyright (c) 1997-1999 Tom Christiansen and Nathan Torkington.
 All rights reserved.
 
 When included as part of the Standard Version of Perl, or as part of
@@ -814,3 +843,4 @@ are hereby placed into the public domain.  You are permitted and
 encouraged to use this code in your own programs for fun
 or for profit as you see fit.  A simple comment in the code giving
 credit would be courteous but is not required.
+
index 31cf9fc..7b3ac3e 100644 (file)
@@ -1,6 +1,6 @@
 =head1 NAME
 
-perlfaq8 - System Interaction ($Revision: 1.26 $, $Date: 1998/08/05 12:20:28 $)
+perlfaq8 - System Interaction ($Revision: 1.36 $, $Date: 1999/01/08 05:36:34 $)
 
 =head1 DESCRIPTION
 
@@ -325,7 +325,6 @@ go bump in the night, finally came up with this:
        }
     }
 
-
 =head2 How do I decode encrypted password files?
 
 You spend lots and lots of money on dedicated hardware, but this is
@@ -449,12 +448,12 @@ http://www.perl.com/CPAN/doc/misc/ancient/tutorial/eg/itimers.pl .
 
 =head2 How can I measure time under a second?
 
-The Time::HiRes module (available from CPAN) provides this
-functionality for some systems.
+In general, you may not be able to.  The Time::HiRes module (available
+from CPAN) provides this functionality for some systems.
 
-In general, you may not be able to.  But if your system supports both the
-syscall() function in Perl as well as a system call like gettimeofday(2),
-then you may be able to do something like this:
+If your system supports both the syscall() function in Perl as well as
+a system call like gettimeofday(2), then you may be able to do
+something like this:
 
     require 'sys/syscall.ph';
 
@@ -462,7 +461,7 @@ then you may be able to do something like this:
 
     $done = $start = pack($TIMEVAL_T, ());
 
-    syscall( &SYS_gettimeofday, $start, 0)) != -1
+    syscall( &SYS_gettimeofday, $start, 0) != -1
                or die "gettimeofday: $!";
 
        ##########################
@@ -674,19 +673,26 @@ there, and the old standard error shows up on the old standard out.
 
 =head2 Why doesn't open() return an error when a pipe open fails?
 
-It does, but probably not how you expect it to.  On systems that
-follow the standard fork()/exec() paradigm (such as Unix), it works like
-this: open() causes a fork().  In the parent, open() returns with the
-process ID of the child.  The child exec()s the command to be piped
-to/from.  The parent can't know whether the exec() was successful or
-not - all it can return is whether the fork() succeeded or not.  To
-find out if the command succeeded, you have to catch SIGCHLD and
-wait() to get the exit status.  You should also catch SIGPIPE if
-you're writing to the child -- you may not have found out the exec()
+Because the pipe open takes place in two steps: first Perl calls
+fork() to start a new process, then this new process calls exec() to
+run the program you really wanted to open.  The first step reports
+success or failure to your process, so open() can only tell you
+whether the fork() succeeded or not.
+
+To find out if the exec() step succeeded, you have to catch SIGCHLD
+and wait() to get the exit status.  You should also catch SIGPIPE if
+you're writing to the child--you may not have found out the exec()
 failed by the time you write.  This is documented in L<perlipc>.
 
+In some cases, even this won't work.  If the second argument to a
+piped open() contains shell metacharacters, perl fork()s, then exec()s
+a shell to decode the metacharacters and eventually run the desired
+program.  Now when you call wait(), you only learn whether or not the
+I<shell> could be successfully started.  Best to avoid shell
+metacharacters.
+
 On systems that follow the spawn() paradigm, open() I<might> do what
-you expect - unless perl uses a shell to start your command. In this
+you expect--unless perl uses a shell to start your command. In this
 case the fork()/exec() description still applies.
 
 =head2 What's wrong with using backticks in a void context?
@@ -908,7 +914,7 @@ the current process group of your controlling terminal as follows:
 
     use POSIX qw/getpgrp tcgetpgrp/;
     open(TTY, "/dev/tty") or die $!;
-    $tpgrp = tcgetpgrp(TTY);
+    $tpgrp = tcgetpgrp(fileno(*TTY));
     $pgrp = getpgrp();
     if ($tpgrp == $pgrp) {
         print "foreground\n";
@@ -1034,6 +1040,13 @@ scripts that use the modules/libraries (see L<perlrun>) or say
 
     use lib '/u/mydir/perl';
 
+This is almost the same as:
+
+    BEGIN {
+       unshift(@INC, '/u/mydir/perl');
+    }
+
+except that the lib module checks for machine-dependent subdirectories.
 See Perl's L<lib> for more information.
 
 =head2 How do I add the directory my program lives in to the module/library search path?
@@ -1056,9 +1069,15 @@ The latter is particularly useful because it knows about machine
 dependent architectures.  The lib.pm pragmatic module was first
 included with the 5.002 release of Perl.
 
+=head2 What is socket.ph and where do I get it?
+
+It's a perl4-style file defining values for system networking
+constants.  Sometimes it is built using h2ph when Perl is installed,
+but other times it is not.  Modern programs C<use Socket;> instead.
+
 =head1 AUTHOR AND COPYRIGHT
 
-Copyright (c) 1997, 1998 Tom Christiansen and Nathan Torkington.
+Copyright (c) 1997-1999 Tom Christiansen and Nathan Torkington.
 All rights reserved.
 
 When included as part of the Standard Version of Perl, or as part of
@@ -1073,3 +1092,4 @@ are hereby placed into the public domain.  You are permitted and
 encouraged to use this code in your own programs for fun
 or for profit as you see fit.  A simple comment in the code giving
 credit would be courteous but is not required.
+
index 1a5e61f..46c487b 100644 (file)
@@ -1,6 +1,6 @@
 =head1 NAME
 
-perlfaq9 - Networking ($Revision: 1.20 $, $Date: 1998/06/22 18:31:09 $)
+perlfaq9 - Networking ($Revision: 1.24 $, $Date: 1999/01/08 05:39:48 $)
 
 =head1 DESCRIPTION
 
@@ -77,8 +77,7 @@ stamp prepended.
 =head2 How do I remove HTML from a string?
 
 The most correct way (albeit not the fastest) is to use HTML::Parse
-from CPAN (part of the libwww-perl distribution, which is a must-have
-module for all web hackers).
+from CPAN (part of the HTML-Tree package on CPAN).
 
 Many folks attempt a simple-minded regular expression approach, like
 C<s/E<lt>.*?E<gt>//g>, but that fails in many cases because the tags
@@ -172,6 +171,7 @@ do this.  They work through proxies, and don't require lynx:
     getprint "http://www.sn.no/libwww-perl/";
 
     # or print ASCII from HTML from a URL
+    # also need HTML-Tree package from CPAN
     use LWP::Simple;
     use HTML::Parse;
     use HTML::FormatText;
@@ -303,7 +303,7 @@ In short, they're bad hacks.  Resist them at all costs.  Please do not be
 tempted to reinvent the wheel.  Instead, use the CGI.pm or CGI_Lite.pm
 (available from CPAN), or if you're trapped in the module-free land
 of perl1 .. perl4, you might look into cgi-lib.pl (available from
-http://www.bio.cam.ac.uk/web/form.html).
+http://cgi-lib.stanford.edu/cgi-lib/ ).
 
 Make sure you know whether to use a GET or a POST in your form.
 GETs should only be used for something that doesn't update the server.
@@ -387,7 +387,7 @@ Sys::Hostname module (which is part of the standard perl distribution),
 you can probably try using something like this:
 
     use Sys::Hostname;
-    $address = sprintf('%s@%s', (getpwuid($<))[0], hostname);
+    $address = sprintf('%s@%s', getpwuid($<), hostname);
 
 Company policies on mail address can mean that this generates addresses
 that the company's mail system will not accept, so you should ask for
@@ -411,7 +411,8 @@ Use the C<sendmail> program directly:
     To: Final Destination <you\@otherhost>
     Subject: A relevant subject line
 
-    Body of the message goes here, in as many lines as you like.
+    Body of the message goes here after the blank line
+    in as many lines as you like.
     EOF
     close(SENDMAIL)     or warn "sendmail didn't close nicely";
 
@@ -442,9 +443,8 @@ include queueing, MX records, and security.
 
 =head2 How do I read mail?
 
-Use the Mail::Folder module from CPAN
-(part of the MailFolder package) or the Mail::Internet module from
-CPAN (also part of the MailTools package).
+Use the Mail::Folder module from CPAN (part of the MailFolder package) or
+the Mail::Internet module from CPAN (also part of the MailTools package).
 
    # sending mail
     use Mail::Internet;
@@ -504,7 +504,7 @@ give you the hostname after which you can find out the IP address
     use Socket;
     use Sys::Hostname;
     my $host = hostname();
-    my $addr = inet_ntoa(scalar(gethostbyname($name)) || 'localhost');
+    my $addr = inet_ntoa(scalar gethostbyname($host || 'localhost'));
 
 Probably the simplest way to learn your DNS domain name is to grok
 it out of /etc/resolv.conf, at least under Unix.  Of course, this
@@ -531,11 +531,12 @@ available from CPAN) is more complex but can put as well as fetch.
 
 A DCE::RPC module is being developed (but is not yet available), and
 will be released as part of the DCE-Perl package (available from
-CPAN).  No ONC::RPC module is known.
+CPAN).  The rpcgen suite, available from CPAN/authors/id/JAKE/, is
+an RPC stub generator and includes an RPC::ONC module.
 
 =head1 AUTHOR AND COPYRIGHT
 
-Copyright (c) 1997, 1998 Tom Christiansen and Nathan Torkington.
+Copyright (c) 1997-1999 Tom Christiansen and Nathan Torkington.
 All rights reserved.
 
 When included as part of the Standard Version of Perl, or as part of
@@ -550,3 +551,4 @@ are hereby placed into the public domain.  You are permitted and
 encouraged to use this code in your own programs for fun
 or for profit as you see fit.  A simple comment in the code giving
 credit would be courteous but is not required.
+