X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=pod%2Fperlfaq8.pod;h=95305249cd76910243e6a335d8bad1474198a245;hb=4ff31b786b9f6148fc8ea695db081861576d06a2;hp=d357f1ecd57a49613ee2d6910d0e505ad1eeeb33;hpb=ac003c96a6d5a0d39f4ecf8f3491d6a6408e7b47;p=p5sagit%2Fp5-mst-13.2.git diff --git a/pod/perlfaq8.pod b/pod/perlfaq8.pod index d357f1e..9530524 100644 --- a/pod/perlfaq8.pod +++ b/pod/perlfaq8.pod @@ -1,6 +1,6 @@ =head1 NAME -perlfaq8 - System Interaction ($Revision: 9667 $) +perlfaq8 - System Interaction =head1 DESCRIPTION @@ -20,11 +20,16 @@ the name of the operating system (not its release number) that your perl binary was built for. =head2 How come exec() doesn't return? +X X X X X -Because that's what it does: it replaces your currently running -program with a different one. If you want to keep going (as is -probably the case if you're asking this question) use system() -instead. +(contributed by brian d foy) + +The C function's job is to turn your process into another +command and never to return. If that's not what you want to do, don't +use C. :) + +If you want to run an external command and still keep your Perl process +going, look at a piped C, C, or C. =head2 How do I do fancy stuff with the keyboard/screen/mouse? @@ -169,24 +174,50 @@ not to block: =head2 How do I clear the screen? -If you only have do so infrequently, use C: +(contributed by brian d foy) - system("clear"); +To clear the screen, you just have to print the special sequence +that tells the terminal to clear the screen. Once you have that +sequence, output it when you want to clear the screen. -If you have to do this a lot, save the clear string -so you can print it 100 times without calling a program -100 times: +You can use the C module to get the special +sequence. Import the C function (or the C<:screen> tag): - $clear_string = `clear`; - print $clear_string; + use Term::ANSIScreen qw(cls); + my $clear_screen = cls(); + + print $clear_screen; -If you're planning on doing other screen manipulations, like cursor -positions, etc, you might wish to use Term::Cap module: +The C module can also get the special sequence if you want +to deal with the low-level details of terminal control. The C +method returns the string for the given capability: use Term::Cap; - $terminal = Term::Cap->Tgetent( {OSPEED => 9600} ); + + $terminal = Term::Cap->Tgetent( { OSPEED => 9600 } ); $clear_string = $terminal->Tputs('cl'); + print $clear_screen; + +On Windows, you can use the C module. After creating +an object for the output filehandle you want to affect, call the +C method: + + Win32::Console; + + $OUT = Win32::Console->new(STD_OUTPUT_HANDLE); + my $clear_string = $OUT->Cls; + + print $clear_screen; + +If you have a command-line program that does the job, you can call +it in backticks to capture whatever it outputs so you can use it +later: + + $clear_string = `clear`; + + print $clear_string; + =head2 How do I get the screen size? If you have Term::ReadKey module installed from CPAN, @@ -346,18 +377,25 @@ passwd(1), for example). =head2 How do I start a process in the background? -Several modules can start other processes that do not block -your Perl program. You can use IPC::Open3, Parallel::Jobs, -IPC::Run, and some of the POE modules. See CPAN for more -details. +(contributed by brian d foy) + +There's not a single way to run code in the background so you don't +have to wait for it to finish before your program moves on to other +tasks. Process management depends on your particular operating system, +and many of the techniques are in L. -You could also use +Several CPAN modules may be able to help, including IPC::Open2 or +IPC::Open3, IPC::Run, Parallel::Jobs, Parallel::ForkManager, POE, +Proc::Background, and Win32::Process. There are many other modules you +might use, so check those namespaces for other options too. + +If you are on a unix-like system, you might be able to get away with a +system call where you put an C<&> on the end of the command: system("cmd &") -or you could use fork as documented in L, with -further examples in L. Some things to be aware of, if you're -on a Unix-like system: +You can also try using C, as described in L (although +this is the same thing that many of the modules will do for you). =over 4 @@ -461,48 +499,25 @@ probably get away with setting an environment variable: system "trn comp.lang.perl.misc"; =head2 How can I sleep() or alarm() for under a second? +X X X X -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 module (part of the standard distribution as of +Perl 5.8) measures time with the C system call, which +returns the time in microseconds since the epoch. If you can't install +C for older Perls and you are on a Unixish system, you +may be able to call C directly. See +L. =head2 How can I do an atexit() or setjmp()/longjmp()? (Exception handling) @@ -848,10 +863,11 @@ stuck, because Windows does not have an argc/argv-style API. =head2 Why can't my script read from STDIN after I gave it EOF (^D on Unix, ^Z on MS-DOS)? -Some stdio's set error and eof flags that need clearing. The -POSIX module defines clearerr() that you can use. That is the -technically correct way to do it. Here are some less reliable -workarounds: +This happens only if your perl is compiled to use stdio instead of +perlio, which is the default. Some (maybe all?) stdio's set error and +eof flags that you may need to clear. The POSIX module defines +clearerr() that you can use. That is the technically correct way to +do it. Here are some less reliable workarounds: =over 4 @@ -1030,8 +1046,24 @@ The alarm() function is not implemented on all versions of Windows. Check the documentation for your specific version of Perl. =head2 How do I set CPU limits? +X X X + +(contributed by Xho) + +Use the C 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 and your systems documentation for the gory +details. =head2 How do I avoid zombies on a Unix system? @@ -1188,46 +1220,56 @@ and use?". =head2 What's the difference between require and use? -Perl offers several different ways to include code from one file into -another. Here are the deltas between the various inclusion constructs: +(contributed by brian d foy) - 1) do $file is like eval `cat $file`, except the former - 1.1: searches @INC and updates %INC. - 1.2: bequeaths an *unrelated* lexical scope on the eval'ed code. +Perl runs C statement at run-time. Once Perl loads, compiles, +and runs the file, it doesn't do anything else. The C statement +is the same as a C run at compile-time, but Perl also calls the +C method for the loaded package. These two are the same: - 2) require $file is like do $file, except the former - 2.1: checks for redundant loading, skipping already loaded files. - 2.2: raises an exception on failure to find, compile, or execute $file. + use MODULE qw(import list); - 3) require Module is like require "Module.pm", except the former - 3.1: translates each "::" into your system's directory separator. - 3.2: primes the parser to disambiguate class Module as an indirect object. + BEGIN { + require MODULE; + MODULE->import(import list); + } - 4) use Module is like require Module, except the former - 4.1: loads the module at compile time, not run-time. - 4.2: imports symbols and semantics from that package to the current one. +However, you can suppress the C by using an explicit, empty +import list. Both of these still happen at compile-time: -In general, you usually want C and a proper Perl module. + use MODULE (); + + BEGIN { + require MODULE; + } + +Since C will also call the C method, the actual value +for C must be a bareword. That is, C cannot load files +by name, although C can: + + require "$ENV{HOME}/lib/Foo.pm"; # no @INC searching! + +See the entry for C in L for more details. =head2 How do I keep my own module/library directory? When you build modules, tell Perl where to install the modules. -For C-based distributions, use the PREFIX and LIB options +For C-based distributions, use the INSTALL_BASE option when generating Makefiles: - perl Makefile.PL PREFIX=/mydir/perl LIB=/mydir/perl/lib + perl Makefile.PL INSTALL_BASE=/mydir/perl You can set this in your CPAN.pm configuration so modules automatically install in your private library directory when you use the CPAN.pm shell: % cpan - cpan> o conf makepl_arg PREFIX=/mydir/perl,LIB=/mydir/perl/lib + cpan> o conf makepl_arg INSTALL_BASE=/mydir/perl cpan> o conf commit For C-based distributions, use the --install_base option: - perl Build.PL --install_base /mydir/perl + perl Build.PL --install_base /mydir/perl You can configure CPAN.pm to automatically use this option too: @@ -1235,6 +1277,19 @@ You can configure CPAN.pm to automatically use this option too: cpan> o conf mbuild_arg --install_base /mydir/perl cpan> o conf commit +INSTALL_BASE tells these tools to put your modules into +F. See L for details on how to run your newly +installed moudles. + +There is one caveat with INSTALL_BASE, though, since it acts +differently than the PREFIX and LIB settings that older versions of +ExtUtils::MakeMaker advocated. INSTALL_BASE does not support +installing modules for multiple versions of Perl or different +architectures under the same directory. You should consider if you +really want that , and if you do, use the older PREFIX and LIB +settings. See the ExtUtils::Makemaker documentation for more details. + =head2 How do I add the directory my program lives in to the module/library search path? (contributed by brian d foy) @@ -1244,7 +1299,7 @@ for any other directory. You might if you know the directory at compile time: use lib $directory; - + The trick in this task is to find the directory. Before your script does anything else (such as a C), you can get the current working directory with the C module, which comes with Perl: @@ -1253,30 +1308,28 @@ directory with the C module, which comes with Perl: use Cwd; our $directory = cwd; } - + use lib $directory; - + You can do a similar thing with the value of C<$0>, which holds the script name. That might hold a relative path, but C can turn -it into an absolute path. Once you have the +it into an absolute path. Once you have the - BEGIN { + BEGIN { use File::Spec::Functions qw(rel2abs); use File::Basename qw(dirname); - + my $path = rel2abs( $0 ); our $directory = dirname( $path ); } - + use lib $directory; -The C module, which comes with Perl, might work. It searches -through C<$ENV{PATH}> (so your script has to be in one of those -directories). You can then use that directory (in C<$FindBin::Bin>) -to locate nearby directories you want to add: +The C module, which comes with Perl, might work. It finds the +directory of the currently running script and puts it in C<$Bin>, which +you can then use to construct the right library path: - use FindBin; - use lib "$FindBin::Bin/../lib"; + use FindBin qw($Bin); =head2 How do I add a directory to my include path (@INC) at runtime? @@ -1311,21 +1364,21 @@ 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 +It's a Perl 4 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 instead. =head1 REVISION -Revision: $Revision: 9667 $ +Revision: $Revision$ -Date: $Date: 2007-06-20 06:13:55 +0200 (Wed, 20 Jun 2007) $ +Date: $Date$ See L for source control details and availability. =head1 AUTHOR AND COPYRIGHT -Copyright (c) 1997-2007 Tom Christiansen, Nathan Torkington, and +Copyright (c) 1997-2009 Tom Christiansen, Nathan Torkington, and other authors as noted. All rights reserved. This documentation is free; you can redistribute it and/or modify it