Tom Christiansen wrote the original perlfaq then expanded it with the
help of Nat Torkington. The perlfaq-workers maintain current document
-and the dezinens of comp.lang.perl.misc regularly review and update the
+and the denizens of comp.lang.perl.misc regularly review and update the
FAQ. Several people have contributed answers, corrections, and comments,
and the perlfaq notes those contributions wherever appropriate.
=head1 AUTHOR AND COPYRIGHT
-Tom Christainsen wrote the original version of this document.
+Tom Christiansen wrote the original version of this document.
brian d foy C<< <bdfoy@cpan.org> >> wrote this version. See the
individual perlfaq documents for additional copyright information.
=item *
-How can I use X or Tk with Perl?
+How can I write a GUI (X, Tk, Gtk, etc.) in Perl?
=item *
=item *
+How can I open a filehandle to a string?
+
+=item *
+
How can I output my numbers with commas added?
=item *
=item *
+How do I adopt or take over a module already on CPAN?
+
+=item *
+
How do I create a class?
=item *
=head1 NAME
-perlfaq1 - General Questions About Perl ($Revision: 9681 $)
+perlfaq1 - General Questions About Perl ($Revision: 10127 $)
=head1 DESCRIPTION
(contributed by brian d foy)
-In short, Pelr 4 is the past, Perl 5 is the present, and Perl 6 is the
+In short, Perl 4 is the past, Perl 5 is the present, and Perl 6 is the
future.
The number after perl (i.e. the 5 after Perl 5) is the major release
support.
The current major release of Perl is Perl 5, and was released in 1994.
-It can run scripts from the previous major release, perl4 (March 1991),
+It can run scripts from the previous major release, Perl 4 (March 1991),
but has significant differences. It introduced the concept of references,
complex data structures, and modules. The Perl 5 interpreter was a
complete re-write of the previous perl sources.
Ponie stands for "Perl On the New Internal Engine", started by Arthur
Bergman from Fotango in 2003, and subsequently run as a project of The
Perl Foundation. It was abandoned in 2006
-(http://www.nntp.perl.org/group/perl.ponie.dev/487).
+( http://www.nntp.perl.org/group/perl.ponie.dev/487 ).
Instead of using the current Perl internals, Ponie aimed to create a
new one that would provide a translation path from Perl 5 to Perl 6
=head2 What's the difference between "perl" and "Perl"?
One bit. Oh, you weren't talking ASCII? :-) Larry now uses "Perl" to
-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. But never
-write "PERL", because perl is not an acronym, apocryphal
-folklore and post-facto expansions notwithstanding.
+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."
+
+Before the first edition of I<Programming perl>, people commonly
+referred to the language as "perl", and its name appeared that way in
+the title because it referred to the interpreter. In the book, Randal
+Schwartz capitalised the language's name to make it stand out better
+when typeset. This convention was adopted by the community, and the
+second edition became I<Programming Perl>, using the capitalized
+version of the name to refer to the language.
+
+You may or may not choose to follow this usage. For example,
+parallelism means "awk and perl" and "Python and Perl" look good, while
+"awk and Perl" and "Python and perl" do not. But never write "PERL",
+because perl is not an acronym, apocryphal folklore and post-facto
+expansions notwithstanding.
=head2 Is it a Perl program or a Perl script?
=head1 REVISION
-Revision: $Revision: 9681 $
+Revision: $Revision: 10127 $
-Date: $Date: 2007-06-26 01:36:56 +0200 (Tue, 26 Jun 2007) $
+Date: $Date: 2007-10-27 21:40:20 +0200 (Sat, 27 Oct 2007) $
See L<perlfaq> for source control details and availability.
=head1 NAME
-perlfaq2 - Obtaining and Learning about Perl ($Revision: 9462 $)
+perlfaq2 - Obtaining and Learning about Perl ($Revision: 10144 $)
=head1 DESCRIPTION
Someone looking for a perl for Win16 might look to Laszlo Molnar's
djgpp port in http://www.cpan.org/ports/#msdos , which comes with
-clear installation instructions. A simple installation guide for
-MS-DOS using Ilya Zakharevich's OS/2 port is available at
-http://www.cs.ruu.nl/%7Epiet/perl5dos.html
-and similarly for Windows 3.1 at http://www.cs.ruu.nl/%7Epiet/perlwin3.html .
+clear installation instructions.
=head2 I don't have a C compiler. How can I build my own Perl interpreter?
You might look around the net for a pre-built binary of Perl (or a
C compiler!) that meets your needs, though:
-For Windows, Vanilla Perl (http://vanillaperl.com/) comes with a
+For Windows, Vanilla Perl ( http://vanillaperl.com/ ) and Strawberry Perl
+( http://strawberryperl.com/ ) come with a
bundled C compiler. ActivePerl is a pre-compiled version of Perl
ready-to-use.
Intermediate Perl (the "Alpaca Book")
by Randal L. Schwartz and brian d foy, with Tom Phoenix (foreword by Damian Conway)
ISBN 0-596-10206-2 [1st edition March 2006]
- http://www.oreilly.com/catalog/lrnperlorm/
+ http://www.oreilly.com/catalog/intermediateperl/
+
+ Mastering Perl
+ by brian d foy
+ ISBN 0-596-52724-1 [1st edition July 2007]
+ http://www.oreilly.com/catalog/9780596527242/
=item Task-Oriented
ISBN 0-596-00503-2 [1st edition January 2004]
http://www.oreilly.com/catalog/perldebugpr/
+ Pro Perl Debugging
+ by Richard Foley with Andy Lester
+ ISBN 1-59059-454-1 [1st edition July 2005]
+ http://www.apress.com/book/view/1590594541
+
=back
=head2 Which magazines have Perl content?
which maintains the web site http://www.perl.org/ as a general
advocacy site for the Perl language. It uses the domain to provide
general support services to the Perl community, including the hosting
-of mailing lists, web sites, and other services. The web site
-http://www.perl.org/ is a general advocacy site for the Perl language,
-and there are many other sub-domains for special topics, such as
+of mailing lists, web sites, and other services. There are also many
+other sub-domains for special topics like learning Perl, Perl news, jobs
+in Perl, such as:
http://learn.perl.org/
http://use.perl.org/
=head1 REVISION
-Revision: $Revision: 9462 $
+Revision: $Revision: 10144 $
-Date: $Date: 2007-04-27 08:24:33 +0200 (Fri, 27 Apr 2007) $
+Date: $Date: 2007-10-31 13:50:01 +0100 (Wed, 31 Oct 2007) $
See L<perlfaq> for source control details and availability.
=head1 NAME
-perlfaq3 - Programming Tools ($Revision: 8539 $)
+perlfaq3 - Programming Tools ($Revision: 10127 $)
=head1 DESCRIPTION
If you'd like a graphical user interface and you have Tk, you can use
C<ptkdb>. It's on CPAN and available for free.
-If you need something much more sophisicated and controllable, Leon
+If you need something much more sophisticated and controllable, Leon
Brocard's Devel::ebug (which you can call with the -D switch as -Debug)
gives you the programmatic hooks into everything you need to write your
own (without too much pain and suffering).
The a2ps http://www-inf.enst.fr/%7Edemaille/a2ps/black+white.ps.gz does
lots of things related to generating nicely printed output of
-documents, as does enscript at http://people.ssh.fi/mtr/genscript/ .
+documents.
=head2 Is there a ctags for Perl?
environments) comes with a simple editor. Popular external editors are
BBEdit ( http://www.bbedit.com/ ) or Alpha (
http://www.his.com/~jguyer/Alpha/Alpha8.html ). MacOS X users can use
-Unix editors as well. Neil Bowers (the man behind Geekcruises) has a
-list of Mac editors that can handle Perl (
-http://www.neilbowers.org/macperleditors.html ).
+Unix editors as well.
=over 4
There is also a toyedit Text widget based editor written in Perl
that is distributed with the Tk module on CPAN. The ptkdb
-( http://world.std.com/~aep/ptkdb/ ) is a Perl/tk based debugger that
+( http://ptkdb.sourceforge.net/ ) is a Perl/tk based debugger that
acts as a development environment of sorts. Perl Composer
( http://perlcomposer.sourceforge.net/ ) is an IDE for Perl/Tk
GUI creation.
this program repeats a command and updates the screen as needed, rendering
B<rep ps axu> similar to B<top>.
-=head2 How can I use X or Tk with Perl?
+=head2 How can I write a GUI (X, Tk, Gtk, etc.) in Perl?
+X<GUI> X<Tk> X<Wx> X<WxWidgets> X<Gtk> X<Gtk2> X<CamelBones> X<Qt>
-The Tk.pm module is a completely Perl-based, object-oriented interface
-to the Tk toolkit that doesn't force you to use Tcl just to get at Tk.
-Sx is an interface to the Athena Widget set. Both are available from
-CPAN. See the directory
-http://www.cpan.org/modules/by-category/08_User_Interfaces/
+(contributed by Ben Morrow)
-Invaluable for Perl/Tk programming are the Perl/Tk FAQ at
-http://phaseit.net/claird/comp.lang.perl.tk/ptkFAQ.html , the Perl/Tk Reference
-Guide available at
-http://www.cpan.org/authors/Stephen_O_Lidie/ , and the
-online manpages at
-http://www-users.cs.umn.edu/%7Eamundson/perl/perltk/toc.html .
+There are a number of modules which let you write GUIs in Perl. Most
+GUI toolkits have a perl interface: an incomplete list follows.
+
+=over 4
+
+=item Tk
+
+This works under Unix and Windows, and the current version doesn't
+look half as bad under Windows as it used to. Some of the gui elements
+still don't 'feel' quite right, though. The interface is very natural
+and 'perlish', making it easy to use in small scripts that just need a
+simple gui. It hasn't been updated in a while.
+
+=item Wx
+
+This is a Perl binding for the cross-platform wxWidgets toolkit
+L<http://www.wxwidgets.org>. It works under Unix, Win32 and Mac OS X,
+using native widgets (Gtk under Unix). The interface follows the C++
+interface closely, but the documentation is a little sparse for someone
+who doesn't know the library, mostly just referring you to the C++
+documentation.
+
+=item Gtk and Gtk2
+
+These are Perl bindings for the Gtk toolkit L<http://www.gtk.org>. The
+interface changed significantly between versions 1 and 2 so they have
+separate Perl modules. It runs under Unix, Win32 and Mac OS X (currently
+it requires an X server on Mac OS, but a 'native' port is underway), and
+the widgets look the same on every plaform: i.e., they don't match the
+native widgets. As with Wx, the Perl bindings follow the C API closely,
+and the documentation requires you to read the C documentation to
+understand it.
+
+=item Win32::GUI
+
+This provides access to most of the Win32 GUI widgets from Perl.
+Obviously, it only runs under Win32, and uses native widgets. The Perl
+interface doesn't really follow the C interface: it's been made more
+Perlish, and the documentation is pretty good. More advanced stuff may
+require familiarity with the C Win32 APIs, or reference to MSDN.
+
+=item CamelBones
+
+CamelBones L<http://camelbones.sourceforge.net> is a Perl interface to
+Mac OS X's Cocoa GUI toolkit, and as such can be used to produce native
+GUIs on Mac OS X. It's not on CPAN, as it requires frameworks that
+CPAN.pm doesn't know how to install, but installation is via the
+standard OSX package installer. The Perl API is, again, very close to
+the ObjC API it's wrapping, and the documentation just tells you how to
+translate from one to the other.
+
+=item Qt
+
+There is a Perl interface to TrollTech's Qt toolkit, but it does not
+appear to be maintained.
+
+=item Athena
+
+Sx is an interface to the Athena widget set which comes with X, but
+again it appears not to be much used nowadays.
+
+=back
=head2 How can I make my Perl program run faster?
Pass arrays and hashes by reference, not by value. For one thing, it's
the only way to pass multiple lists or hashes (or both) in a single
call/return. It also avoids creating a copy of all the contents. This
-requires some judgment, however, because any changes will be propagated
+requires some judgement, however, because any changes will be propagated
back to the original data. If you really want to mangle (er, modify) a
copy, you'll have to sacrifice the memory needed to make one.
=head1 REVISION
-Revision: $Revision: 8539 $
+Revision: $Revision: 10127 $
-Date: $Date: 2007-01-11 00:07:14 +0100 (Thu, 11 Jan 2007) $
+Date: $Date: 2007-10-27 21:40:20 +0200 (Sat, 27 Oct 2007) $
See L<perlfaq> for source control details and availability.
=head1 NAME
-perlfaq4 - Data Manipulation ($Revision: 9681 $)
+perlfaq4 - Data Manipulation ($Revision: 10126 $)
=head1 DESCRIPTION
(contributed by brian d foy)
If you can avoid it, don't, or if you can use a templating system,
-such as C<Text::Template> or C<Template> Toolkit, do that instead.
+such as C<Text::Template> or C<Template> Toolkit, do that instead. You
+might even be able to get the job done with C<sprintf> or C<printf>:
+
+ my $string = sprintf 'Say hello to %s and %s', $foo, $bar;
However, for the one-off simple case where I don't want to pull out a
full templating system, I'll use a string that has two Perl scalar
variables in it. In this example, I want to expand C<$foo> and C<$bar>
-to their variable's values.
+to their variable's values:
my $foo = 'Fred';
my $bar = 'Barney';
C</e> flag. The first C</e> evaluates C<$1> on the replacement side and
turns it into C<$foo>. The second /e starts with C<$foo> and replaces
it with its value. C<$foo>, then, turns into 'Fred', and that's finally
-what's left in the string.
+what's left in the string:
$string =~ s/(\$\w+)/$1/eeg; # 'Say hello to Fred and Barney'
The C</e> will also silently ignore violations of strict, replacing
-undefined variable names with the empty string.
-
-I could also pull the values from a hash instead of evaluating
-variable names. Using a single C</e>, I can check the hash to ensure
-the value exists, and if it doesn't, I can replace the missing value
-with a marker, in this case C<???> to signal that I missed something:
+undefined variable names with the empty string. Since I'm using the
+C</e> flag (twice even!), I have all of the same security problems I
+have with C<eval> in its string form. If there's something odd in
+C<$foo>, perhaps something like C<@{[ system "rm -rf /" ]}>, then
+I could get myself in trouble.
+
+To get around the security problem, I could also pull the values from
+a hash instead of evaluating variable names. Using a single C</e>, I
+can check the hash to ensure the value exists, and if it doesn't, I
+can replace the missing value with a marker, in this case C<???> to
+signal that I missed something:
my $string = 'This has $foo and $bar';
If you are testing only once, the standard module C<List::Util> exports
the function C<first> for this purpose. It works by stopping once it
-finds the element. It's written in C for speed, and its Perl equivalant
+finds the element. It's written in C for speed, and its Perl equivalent
looks like this subroutine:
sub first (&@) {
my $element = $array[ rand @array ];
=head2 How do I permute N elements of a list?
+X<List::Permuter> X<permute> X<Algorithm::Loops> X<Knuth>
+X<The Art of Computer Programming> X<Fischer-Krause>
-Use the C<List::Permutor> module on CPAN. If the list is actually an
+Use the C<List::Permutor> module on CPAN. If the list is actually an
array, try the C<Algorithm::Permute> module (also on CPAN). It's
-written in XS code and is very efficient.
+written in XS code and is very efficient:
use Algorithm::Permute;
+
my @array = 'a'..'d';
my $p_iterator = Algorithm::Permute->new ( \@array );
+
while (my @perm = $p_iterator->next) {
print "next permutation: (@perm)\n";
}
For even faster execution, you could do:
use Algorithm::Permute;
+
my @array = 'a'..'d';
+
Algorithm::Permute::permute {
print "next permutation: (@array)\n";
} @array;
-Here's a little program that generates all permutations of
-all the words on each line of input. The algorithm embodied
-in the C<permute()> function is discussed in Volume 4 (still
-unpublished) of Knuth's I<The Art of Computer Programming>
-and will work on any list:
+Here's a little program that generates all permutations of all the
+words on each line of input. The algorithm embodied in the
+C<permute()> function is discussed in Volume 4 (still unpublished) of
+Knuth's I<The Art of Computer Programming> and will work on any list:
#!/usr/bin/perl -n
# Fischer-Krause ordered permutation generator
}
}
- permute {print"@_\n"} split;
+ permute { print "@_\n" } split;
+
+The C<Algorithm::Loops> module also provides the C<NextPermute> and
+C<NextPermuteNum> functions which efficiently find all unique permutations
+of an array, even if it contains duplicate values, modifying it in-place:
+if its elements are in reverse-sorted order then the array is reversed,
+making it sorted, and it returns false; otherwise the next
+permutation is returned.
+
+C<NextPermute> uses string order and C<NextPermuteNum> numeric order, so
+you can enumerate all the permutations of C<0..9> like this:
+
+ use Algorithm::Loops qw(NextPermuteNum);
+
+ my @list= 0..9;
+ do { print "@list\n" } while NextPermuteNum @list;
=head2 How do I sort an array by (anything)?
=head1 REVISION
-Revision: $Revision: 9681 $
+Revision: $Revision: 10126 $
-Date: $Date: 2007-06-26 01:36:56 +0200 (Tue, 26 Jun 2007) $
+Date: $Date: 2007-10-27 21:29:20 +0200 (Sat, 27 Oct 2007) $
See L<perlfaq> for source control details and availability.
=head1 NAME
-perlfaq5 - Files and Formats ($Revision: 9576 $)
+perlfaq5 - Files and Formats ($Revision: 10126 $)
=head1 DESCRIPTION
=head2 How do I flush/unbuffer an output filehandle? Why must I do this?
X<flush> X<buffer> X<unbuffer> X<autoflush>
-Perl does not support truly unbuffered output (except
-insofar as you can C<syswrite(OUT, $char, 1)>), although it
-does support is "command buffering", in which a physical
-write is performed after every output command.
-
-The C standard I/O library (stdio) normally buffers
-characters sent to devices so that there isn't a system call
-for each byte. In most stdio implementations, the type of
-output buffering and the size of the buffer varies according
-to the type of device. Perl's print() and write() functions
-normally buffer output, while syswrite() bypasses buffering
-all together.
-
-If you want your output to be sent immediately when you
-execute print() or write() (for instance, for some network
-protocols), you must set the handle's autoflush flag. This
-flag is the Perl variable $| and when it is set to a true
-value, Perl will flush the handle's buffer after each
-print() or write(). Setting $| affects buffering only for
-the currently selected default file handle. You choose this
-handle with the one argument select() call (see
+Perl does not support truly unbuffered output (except insofar as you
+can C<syswrite(OUT, $char, 1)>), although it does support is "command
+buffering", in which a physical write is performed after every output
+command.
+
+The C standard I/O library (stdio) normally buffers characters sent to
+devices so that there isn't a system call for each byte. In most stdio
+implementations, the type of output buffering and the size of the
+buffer varies according to the type of device. Perl's C<print()> and
+C<write()> functions normally buffer output, while C<syswrite()>
+bypasses buffering all together.
+
+If you want your output to be sent immediately when you execute
+C<print()> or C<write()> (for instance, for some network protocols),
+you must set the handle's autoflush flag. This flag is the Perl
+variable C<$|> and when it is set to a true value, Perl will flush the
+handle's buffer after each C<print()> or C<write()>. Setting C<$|>
+affects buffering only for the currently selected default filehandle.
+You choose this handle with the one argument C<select()> call (see
L<perlvar/$E<verbar>> and L<perlfunc/select>).
-Use select() to choose the desired handle, then set its
+Use C<select()> to choose the desired handle, then set its
per-filehandle variables.
$old_fh = select(OUTPUT_HANDLE);
select($old_fh);
Some modules offer object-oriented access to handles and their
-variables, although they may be overkill if this is the only
-thing you do with them. You can use IO::Handle:
+variables, although they may be overkill if this is the only thing you
+do with them. You can use C<IO::Handle>:
use IO::Handle;
- open(DEV, ">/dev/printer"); # but is this?
- DEV->autoflush(1);
+ open my( $printer ), ">", "/dev/printer"); # but is this?
+ $printer->autoflush(1);
-or IO::Socket:
+or C<IO::Socket> (which inherits from C<IO::Handle>):
use IO::Socket; # this one is kinda a pipe?
my $sock = IO::Socket::INET->new( 'www.example.com:80' );
$sock->autoflush();
+You can also flush an C<IO::Handle> object without setting
+C<autoflush>. Call the C<flush> method to flush the buffer yourself:
+
+ use IO::Handle;
+ open my( $printer ), ">", "/dev/printer");
+ $printer->flush; # one time flush
+
+
=head2 How do I change, delete, or insert a line in a file, or append to the beginning of a file?
X<file, editing>
BEGIN {
use Fcntl;
my $temp_dir = -d '/tmp' ? '/tmp' : $ENV{TMPDIR} || $ENV{TEMP};
- my $base_name = sprintf("%s/%d-%d-0000", $temp_dir, $$, time());
+ my $base_name = sprintf "%s/%d-%d-0000", $temp_dir, $$, time;
sub temp_file {
local *FH;
my $count = 0;
- until (defined(fileno(FH)) || $count++ > 100) {
- $base_name =~ s/-(\d+)$/"-" . (1 + $1)/e;
- # O_EXCL is required for security reasons.
- sysopen(FH, $base_name, O_WRONLY|O_EXCL|O_CREAT);
+ until( defined(fileno(FH)) || $count++ > 100 ) {
+ $base_name =~ s/-(\d+)$/"-" . (1 + $1)/e;
+ # O_EXCL is required for security reasons.
+ sysopen FH, $base_name, O_WRONLY|O_EXCL|O_CREAT;
+ }
+
+ if( defined fileno(FH) ) {
+ return (*FH, $base_name);
+ }
+ else {
+ return ();
+ }
}
-
- if (defined(fileno(FH))
- return (*FH, $base_name);
- }
- else {
- return ();
- }
- }
+
}
=head2 How can I manipulate fixed-record-length files?
=head2 How can I write() into a string?
X<write, into a string>
-See L<perlform/"Accessing Formatting Internals"> for an swrite() function.
+See L<perlform/"Accessing Formatting Internals"> for an C<swrite()> function.
+=head2 How can I open a filehandle to a string?
+X<string>, X<open>, X<IO::Scalar>, X<filehandle>
+
+(contributed by Peter J. Holzer, hjp-usenet2@hjp.at)
+
+Since Perl 5.8.0, you can pass a reference to a scalar instead of the
+filename to create a file handle which you can used to read from or write to
+a string:
+
+ open(my $fh, '>', \$string) or die "Could not open string for writing";
+ print $fh "foo\n";
+ print $fh "bar\n"; # $string now contains "foo\nbar\n"
+
+ open(my $fh, '<', \$string) or die "Could not open string for reading";
+ my $x = <$fh>; # $x now contains "foo\n"
+
+With older versions of Perl, the C<IO::String> module provides similar
+functionality.
+
=head2 How can I output my numbers with commas added?
X<number, commify>
Unless you have a particular reason to use the two argument form you
should use the three argument form of open() which does not treat any
-charcters in the filename as special.
+characters in the filename as special.
open FILE, "<", " file "; # filename is " file "
open FILE, ">", ">file"; # filename is ">file"
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 link() have been suggested, but
-these tend to involve busy-wait, which is also subdesirable.
+these tend to involve busy-wait, which is also less than desirable.
=head2 I still don't get locking. I just want to increment the number in the file. How can I do this?
X<counter> X<file, counter>
=head1 REVISION
-Revision: $Revision: 9576 $
+Revision: $Revision: 10126 $
-Date: $Date: 2007-05-19 18:58:05 +0200 (Sat, 19 May 2007) $
+Date: $Date: 2007-10-27 21:29:20 +0200 (Sat, 27 Oct 2007) $
See L<perlfaq> for source control details and availability.
=head1 NAME
-perlfaq6 - Regular Expressions ($Revision: 8539 $)
+perlfaq6 - Regular Expressions ($Revision: 10126 $)
=head1 DESCRIPTION
X<$/, regexes in> X<$INPUT_RECORD_SEPARATOR, regexes in>
X<$RS, regexes in>
-Up to Perl 5.8.0, $/ has to be a string. This may change in 5.10,
-but don't get your hopes up. Until then, you can use these examples
-if you really need to do this.
+$/ has to be a string. You can use these examples if you really need to
+do this.
If you have File::Stream, this is easy.
{
foreach $pattern ( @patterns )
{
- print if /\b$pattern\b/i;
+ print if /$pattern/i;
next LINE;
}
}
=head1 REVISION
-Revision: $Revision: 8539 $
+Revision: $Revision: 10126 $
-Date: $Date: 2007-01-11 00:07:14 +0100 (Thu, 11 Jan 2007) $
+Date: $Date: 2007-10-27 21:29:20 +0200 (Sat, 27 Oct 2007) $
See L<perlfaq> for source control details and availability.
=head1 NAME
-perlfaq7 - General Perl Language Issues ($Revision: 9620 $)
+perlfaq7 - General Perl Language Issues ($Revision: 10100 $)
=head1 DESCRIPTION
which is the best hands-on guide to creating module
distributions.
+=head2 How do I adopt or take over a module already on CPAN?
+
+(contributed by brian d foy)
+
+The easiest way to take over a module is to have the current
+module maintainer either make you a co-maintainer or transfer
+the module to you.
+
+If you can't reach the author for some reason (e.g. email bounces),
+the PAUSE admins at modules@perl.org can help. The PAUSE admins
+treat each case individually.
+
+=over 4
+
+=item
+
+Get a login for the Perl Authors Upload Server (PAUSE) if you don't
+already have one: http://pause.perl.org
+
+=item
+
+Write to modules@perl.org explaining what you did to contact the
+current maintainer. The PAUSE admins will also try to reach the
+maintainer.
+
+=item
+
+Post a public message in a heavily trafficked site announcing your
+intention to take over the module.
+
+=item
+
+Wait a bit. The PAUSE admins don't want to act too quickly in case
+the current maintainer is on holiday. If there's no response to
+private communication or the public post, a PAUSE admin can transfer
+it to you.
+
+=back
+
=head2 How do I create a class?
See L<perltoot> for an introduction to classes and objects, as well as
=head1 REVISION
-Revision: $Revision: 9620 $
+Revision: $Revision: 10100 $
-Date: $Date: 2007-05-29 19:57:58 +0200 (Tue, 29 May 2007) $
+Date: $Date: 2007-10-21 20:59:30 +0200 (Sun, 21 Oct 2007) $
See L<perlfaq> for source control details and availability.
=head1 NAME
-perlfaq8 - System Interaction ($Revision: 9681 $)
+perlfaq8 - System Interaction ($Revision: 10183 $)
=head1 DESCRIPTION
system "trn comp.lang.perl.misc";
=head2 How can I sleep() or alarm() for under a second?
+X<Time::HiRes> X<BSD::Itimer> X<sleep> X<select>
-If you want finer granularity than the 1 second that the sleep()
-function provides, the easiest way is to use the select() function as
-documented in L<perlfunc/"select">. Try the Time::HiRes and
-the BSD::Itimer modules (available from CPAN, and starting from
-Perl 5.8 Time::HiRes is part of the standard distribution).
+If you want finer granularity than the 1 second that the C<sleep()>
+function provides, the easiest way is to use the C<select()> function as
+documented in L<perlfunc/"select">. Try the C<Time::HiRes> and
+the C<BSD::Itimer> modules (available from CPAN, and starting from
+Perl 5.8 C<Time::HiRes> is part of the standard distribution).
=head2 How can I measure time under a second?
+X<Time::HiRes> X<BSD::Itimer> X<sleep> X<select>
-In general, you may not be able to. The Time::HiRes module (available
-from CPAN, and starting from Perl 5.8 part of the standard distribution)
-provides this functionality for some systems.
-
-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';
-
- $TIMEVAL_T = "LL";
-
- $done = $start = pack($TIMEVAL_T, ());
-
- syscall(&SYS_gettimeofday, $start, 0) != -1
- or die "gettimeofday: $!";
-
- ##########################
- # DO YOUR OPERATION HERE #
- ##########################
-
- syscall( &SYS_gettimeofday, $done, 0) != -1
- or die "gettimeofday: $!";
-
- @start = unpack($TIMEVAL_T, $start);
- @done = unpack($TIMEVAL_T, $done);
-
- # fix microseconds
- for ($done[1], $start[1]) { $_ /= 1_000_000 }
+(contributed by brian d foy)
- $delta_time = sprintf "%.4f", ($done[0] + $done[1] )
- -
- ($start[0] + $start[1] );
+The C<Time::HiRes> module (part of the standard distribution as of
+Perl 5.8) measures time with the C<gettimeofday()> system call, which
+returns the time in microseconds since the epoch. If you can't install
+C<Time::HiRes> for older Perls and you are on a Unixish system, you
+may be able to call C<gettimeofday(2)> directly. See
+L<perlfunc/syscall>.
=head2 How can I do an atexit() or setjmp()/longjmp()? (Exception handling)
Check the documentation for your specific version of Perl.
=head2 How do I set CPU limits?
+X<BSD::Resource> X<limit> X<CPU>
+
+(contributed by Xho)
+
+Use the C<BSD::Resource> module from CPAN. As an example:
-Use the BSD::Resource module from CPAN.
+ use BSD::Resource;
+ setrlimit(RLIMIT_CPU,10,20) or die $!;
+
+This sets the soft and hard limits to 10 and 20 seconds, respectively.
+After 10 seconds of time spent running on the CPU (not "wall" time),
+the process will be sent a signal (XCPU on some systems) which, if not
+trapped, will cause the process to terminate. If that signal is
+trapped, then after 10 more seconds (20 seconds in total) the process
+will be killed with a non-trappable signal.
+
+See the C<BSD::Resource> and your systems documentation for the gory
+details.
=head2 How do I avoid zombies on a Unix system?
=head1 REVISION
-Revision: $Revision: 9681 $
+Revision: $Revision: 10183 $
-Date: $Date: 2007-06-26 01:36:56 +0200 (Tue, 26 Jun 2007) $
+Date: $Date: 2007-11-07 09:35:12 +0100 (Wed, 07 Nov 2007) $
See L<perlfaq> for source control details and availability.