3 perlfaq8 - System Interaction ($Revision: 1.21 $, $Date: 1997/04/24 22:44:19 $)
7 This section of the Perl FAQ covers questions involving operating
8 system interaction. This involves interprocess communication (IPC),
9 control over the user-interface (keyboard, screen and pointing
10 devices), and most anything else not related to data manipulation.
12 Read the FAQs and documentation specific to the port of perl to your
13 operating system (eg, L<perlvms>, L<perlplan9>, ...). These should
14 contain more detailed information on the vagaries of your perl.
16 =head2 How do I find out which operating system I'm running under?
18 The $^O variable ($OSTYPE if you use English) contains the operating
19 system that your perl binary was built for.
21 =head2 How come exec() doesn't return?
23 Because that's what it does: it replaces your currently running
24 program with a different one. If you want to keep going (as is
25 probably the case if you're asking this question) use system()
28 =head2 How do I do fancy stuff with the keyboard/screen/mouse?
30 How you access/control keyboards, screens, and pointing devices
31 ("mice") is system-dependent. Try the following modules:
37 Term::Cap Standard perl distribution
39 Term::ReadLine::Gnu CPAN
40 Term::ReadLine::Perl CPAN
45 Term::Cap Standard perl distribution
55 =head2 How do I ask the user for a password?
57 (This question has nothing to do with the web. See a different
60 There's an example of this in L<perlfunc/crypt>). First, you put
61 the terminal into "no echo" mode, then just read the password
62 normally. You may do this with an old-style ioctl() function, POSIX
63 terminal control (see L<POSIX>, and Chapter 7 of the Camel), or a call
64 to the B<stty> program, with varying degrees of portability.
66 You can also do this for most systems using the Term::ReadKey module
67 from CPAN, which is easier to use and in theory more portable.
69 =head2 How do I read and write the serial port?
71 This depends on which operating system your program is running on. In
72 the case of Unix, the serial ports will be accessible through files in
73 /dev; on other systems, the devices names will doubtless differ.
74 Several problem areas common to all device interaction are the
81 Your system may use lockfiles to control multiple access. Make sure
82 you follow the correct protocol. Unpredictable behaviour can result
83 from multiple processes reading from one device.
87 If you expect to use both read and write operations on the device,
88 you'll have to open it for update (see L<perlfunc/"open"> for
89 details). You may wish to open it without running the risk of
90 blocking by using sysopen() and C<O_RDWR|O_NDELAY|O_NOCTTY> from the
91 Fcntl module (part of the standard perl distribution). See
92 L<perlfunc/"sysopen"> for more on this approach.
96 Some devices will be expecting a "\r" at the end of each line rather
97 than a "\n". In some ports of perl, "\r" and "\n" are different from
98 their usual (Unix) ASCII values of "\012" and "\015". You may have to
99 give the numeric values you want directly, using octal ("\015"), hex
100 ("0x0D"), or as a control-character specification ("\cM").
102 print DEV "atv1\012"; # wrong, for some devices
103 print DEV "atv1\015"; # right, for some devices
105 Even though with normal text files, a "\n" will do the trick, there is
106 still no unified scheme for terminating a line that is portable
107 between Unix, DOS/Win, and Macintosh, except to terminate I<ALL> line
108 ends with "\015\012", and strip what you don't need from the output.
109 This applies especially to socket I/O and autoflushing, discussed
112 =item flushing output
114 If you expect characters to get to your device when you print() them,
115 you'll want to autoflush that filehandle, as in the older
125 You can use select() and the C<$|> variable to control autoflushing
126 (see L<perlvar/$|> and L<perlfunc/select>):
132 You'll also see code that does this without a temporary variable, as in
134 select((select(DEV), $| = 1)[0]);
136 As mentioned in the previous item, this still doesn't work when using
137 socket I/O between Unix and Macintosh. You'll need to hardcode your
138 line terminators, in that case.
140 =item non-blocking input
142 If you are doing a blocking read() or sysread(), you'll have to
143 arrange for an alarm handler to provide a timeout (see
144 L<perlfunc/alarm>). If you have a non-blocking open, you'll likely
145 have a non-blocking read, which means you may have to use a 4-arg
146 select() to determine whether I/O is ready on that device (see
147 L<perlfunc/"select">.
151 =head2 How do I decode encrypted password files?
153 You spend lots and lots of money on dedicated hardware, but this is
154 bound to get you talked about.
156 Seriously, you can't if they are Unix password files - the Unix
157 password system employs one-way encryption. Programs like Crack can
158 forcibly (and intelligently) try to guess passwords, but don't (can't)
159 guarantee quick success.
161 If you're worried about users selecting bad passwords, you should
162 proactively check when they try to change their password (by modifying
163 passwd(1), for example).
165 =head2 How do I start a process in the background?
171 or you could use fork as documented in L<perlfunc/"fork">, with
172 further examples in L<perlipc>. Some things to be aware of, if you're
173 on a Unix-like system:
177 =item STDIN, STDOUT and STDERR are shared
179 Both the main process and the backgrounded one (the "child" process)
180 share the same STDIN, STDOUT and STDERR filehandles. If both try to
181 access them at once, strange things can happen. You may want to close
182 or reopen these for the child. You can get around this with
183 C<open>ing a pipe (see L<perlfunc/"open">) but on some systems this
184 means that the child process cannot outlive the parent.
188 You'll have to catch the SIGCHLD signal, and possibly SIGPIPE too.
189 SIGCHLD is sent when the backgrounded process finishes. SIGPIPE is
190 sent when you write to a filehandle whose child process has closed (an
191 untrapped SIGPIPE can cause your program to silently die). This is
192 not an issue with C<system("cmd&")>.
196 You have to be prepared to "reap" the child process when it finishes
198 $SIG{CHLD} = sub { wait };
200 See L<perlipc/"Signals"> for other examples of code to do this.
201 Zombies are not an issue with C<system("prog &")>.
205 =head2 How do I trap control characters/signals?
207 You don't actually "trap" a control character. Instead, that
208 character generates a signal, which you then trap. Signals are
209 documented in L<perlipc/"Signals"> and chapter 6 of the Camel.
211 Be warned that very few C libraries are re-entrant. Therefore, if you
212 attempt to print() in a handler that got invoked during another stdio
213 operation your internal structures will likely be in an
214 inconsistent state, and your program will dump core. You can
215 sometimes avoid this by using syswrite() instead of print().
217 Unless you're exceedingly careful, the only safe things to do inside a
218 signal handler are: set a variable and exit. And in the first case,
219 you should only set a variable in such a way that malloc() is not
220 called (eg, by setting a variable that already has a value).
224 $Interrupted = 0; # to ensure it has a value
227 syswrite(STDERR, "ouch\n", 5);
230 However, because syscalls restart by default, you'll find that if
231 you're in a "slow" call, such as E<lt>FHE<gt>, read(), connect(), or
232 wait(), that the only way to terminate them is by "longjumping" out;
233 that is, by raising an exception. See the time-out handler for a
234 blocking flock() in L<perlipc/"Signals"> or chapter 6 of the Camel.
236 =head2 How do I modify the shadow password file on a Unix system?
238 If perl was installed correctly, the getpw*() functions described in
239 L<perlfunc> provide (read-only) access to the shadow password file.
240 To change the file, make a new shadow password file (the format varies
241 from system to system - see L<passwd(5)> for specifics) and use
242 pwd_mkdb(8) to install it (see L<pwd_mkdb(5)> for more details).
244 =head2 How do I set the time and date?
246 Assuming you're running under sufficient permissions, you should be
247 able to set the system-wide date and time by running the date(1)
248 program. (There is no way to set the time and date on a per-process
249 basis.) This mechanism will work for Unix, MS-DOS, Windows, and NT;
250 the VMS equivalent is C<set time>.
252 However, if all you want to do is change your timezone, you can
253 probably get away with setting an environment variable:
255 $ENV{TZ} = "MST7MDT"; # unixish
256 $ENV{'SYS$TIMEZONE_DIFFERENTIAL'}="-5" # vms
257 system "trn comp.lang.perl";
259 =head2 How can I sleep() or alarm() for under a second?
261 If you want finer granularity than the 1 second that the sleep()
262 function provides, the easiest way is to use the select() function as
263 documented in L<perlfunc/"select">. If your system has itimers and
264 syscall() support, you can check out the old example in
265 http://www.perl.com/CPAN/doc/misc/ancient/tutorial/eg/itimers.pl .
267 =head2 How can I measure time under a second?
269 In general, you may not be able to. The Time::HiRes module (available
270 from CPAN) provides this functionality for some systems.
272 In general, you may not be able to. But if you system supports both the
273 syscall() function in Perl as well as a system call like gettimeofday(2),
274 then you may be able to do something like this:
276 require 'sys/syscall.ph';
280 $done = $start = pack($TIMEVAL_T, ());
282 syscall( &SYS_gettimeofday, $start, 0)) != -1
283 or die "gettimeofday: $!";
285 ##########################
286 # DO YOUR OPERATION HERE #
287 ##########################
289 syscall( &SYS_gettimeofday, $done, 0) != -1
290 or die "gettimeofday: $!";
292 @start = unpack($TIMEVAL_T, $start);
293 @done = unpack($TIMEVAL_T, $done);
296 for ($done[1], $start[1]) { $_ /= 1_000_000 }
298 $delta_time = sprintf "%.4f", ($done[0] + $done[1] )
300 ($start[0] + $start[1] );
302 =head2 How can I do an atexit() or setjmp()/longjmp()? (Exception handling)
304 Release 5 of Perl added the END block, which can be used to simulate
305 atexit(). Each package's END block is called when the program or
306 thread ends (see L<perlmod> manpage for more details). It isn't
307 called when untrapped signals kill the program, though, so if you use
308 END blocks you should also use
310 use sigtrap qw(die normal-signals);
312 Perl's exception-handling mechanism is its eval() operator. You can
313 use eval() as setjmp and die() as longjmp. For details of this, see
314 the section on signals, especially the time-out handler for a blocking
315 flock() in L<perlipc/"Signals"> and chapter 6 of the Camel.
317 If exception handling is all you're interested in, try the
318 exceptions.pl library (part of the standard perl distribution).
320 If you want the atexit() syntax (and an rmexit() as well), try the
321 AtExit module available from CPAN.
323 =head2 Why doesn't my sockets program work under System V (Solaris)? What does the error message "Protocol not supported" mean?
325 Some Sys-V based systems, notably Solaris 2.X, redefined some of the
326 standard socket constants. Since these were constant across all
327 architectures, they were often hardwired into perl code. The proper
328 way to deal with this is to "use Socket" to get the correct values.
330 Note that even though SunOS and Solaris are binary compatible, these
331 values are different. Go figure.
333 =head2 How can I call my system's unique C functions from Perl?
335 In most cases, you write an external module to do it - see the answer
336 to "Where can I learn about linking C with Perl? [h2xs, xsubpp]".
337 However, if the function is a system call, and your system supports
338 syscall(), you can use the syscall function (documented in
341 Remember to check the modules that came with your distribution, and
342 CPAN as well - someone may already have written a module to do it.
344 =head2 Where do I get the include files to do ioctl() or syscall()?
346 Historically, these would be generated by the h2ph tool, part of the
347 standard perl distribution. This program converts cpp(1) directives
348 in C header files to files containing subroutine definitions, like
349 &SYS_getitimer, which you can use as arguments to your functions.
350 It doesn't work perfectly, but it usually gets most of the job done.
351 Simple files like F<errno.h>, F<syscall.h>, and F<socket.h> were fine,
352 but the hard ones like F<ioctl.h> nearly always need to hand-edited.
353 Here's how to install the *.ph files:
359 If your system supports dynamic loading, for reasons of portability and
360 sanity you probably ought to use h2xs (also part of the standard perl
361 distribution). This tool converts C header files to Perl extensions.
362 See L<perlxstut> for how to get started with h2xs.
364 If your system doesn't support dynamic loading, you still probably
365 ought to use h2xs. See L<perlxstut> and L<ExtUtils::MakeMaker> for
366 more information (in brief, just use B<make perl> instead of a plain
367 B<make> to rebuild perl with a new static extension).
369 =head2 Why do setuid perl scripts complain about kernel problems?
371 Some operating systems have bugs in the kernel that make setuid
372 scripts inherently insecure. Perl gives you a number of options
373 (described in L<perlsec>) to work around such systems.
375 =head2 How can I open a pipe both to and from a command?
377 The IPC::Open2 module (part of the standard perl distribution) is an
378 easy-to-use approach that internally uses pipe(), fork(), and exec()
379 to do the job. Make sure you read the deadlock warnings in its
380 documentation, though (see L<IPC::Open2>).
382 =head2 Why can't I get the output of a command with system()?
384 You're confusing the purpose of system() and backticks (``). system()
385 runs a command and returns exit status information (as a 16 bit value:
386 the low 8 bits are the signal the process died from, if any, and
387 the high 8 bits are the actual exit value). Backticks (``) run a
388 command and return what it sent to STDOUT.
390 $exit_status = system("mail-users");
391 $output_string = `ls`;
393 =head2 How can I capture STDERR from an external command?
395 There are three basic ways of running external commands:
397 system $cmd; # using system()
398 $output = `$cmd`; # using backticks (``)
399 open (PIPE, "cmd |"); # using open()
401 With system(), both STDOUT and STDERR will go the same place as the
402 script's versions of these, unless the command redirects them.
403 Backticks and open() read B<only> the STDOUT of your command.
405 With any of these, you can change file descriptors before the call:
407 open(STDOUT, ">logfile");
410 or you can use Bourne shell file-descriptor redirection:
412 $output = `$cmd 2>some_file`;
413 open (PIPE, "cmd 2>some_file |");
415 You can also use file-descriptor redirection to make STDERR a
418 $output = `$cmd 2>&1`;
419 open (PIPE, "cmd 2>&1 |");
421 Note that you I<cannot> simply open STDERR to be a dup of STDOUT
422 in your Perl program and avoid calling the shell to do the redirection.
425 open(STDERR, ">&STDOUT");
426 $alloutput = `cmd args`; # stderr still escapes
428 This fails because the open() makes STDERR go to where STDOUT was
429 going at the time of the open(). The backticks then make STDOUT go to
430 a string, but don't change STDERR (which still goes to the old
433 Note that you I<must> use Bourne shell (sh(1)) redirection syntax in
434 backticks, not csh(1)! Details on why Perl's system() and backtick
435 and pipe opens all use the Bourne shell are in
436 http://www.perl.com/CPAN/doc/FMTEYEWTK/versus/csh.whynot .
438 You may also use the IPC::Open3 module (part of the standard perl
439 distribution), but be warned that it has a different order of
440 arguments from IPC::Open2 (see L<IPC::Open3>).
442 =head2 Why doesn't open() return an error when a pipe open fails?
444 It does, but probably not how you expect it to. On systems that
445 follow the standard fork()/exec() paradigm (eg, Unix), it works like
446 this: open() causes a fork(). In the parent, open() returns with the
447 process ID of the child. The child exec()s the command to be piped
448 to/from. The parent can't know whether the exec() was successful or
449 not - all it can return is whether the fork() succeeded or not. To
450 find out if the command succeeded, you have to catch SIGCHLD and
451 wait() to get the exit status. You should also catch SIGPIPE if
452 you're writing to the child -- you may not have found out the exec()
453 failed by the time you write. This is documented in L<perlipc>.
455 On systems that follow the spawn() paradigm, open() I<might> do what
456 you expect - unless perl uses a shell to start your command. In this
457 case the fork()/exec() description still applies.
459 =head2 What's wrong with using backticks in a void context?
461 Strictly speaking, nothing. Stylistically speaking, it's not a good
462 way to write maintainable code because backticks have a (potentially
463 humungous) return value, and you're ignoring it. It's may also not be very
464 efficient, because you have to read in all the lines of output, allocate
465 memory for them, and then throw it away. Too often people are lulled
470 And now they think "Hey, I'll just always use backticks to run programs."
471 Bad idea: backticks are for capturing a program's output; the system()
472 function is for running programs.
478 You haven't assigned the output anywhere, so it just wastes memory
479 (for a little while). Plus you forgot to check C<$?> to see whether
480 the program even ran correctly. Even if you wrote
482 print `cat /etc/termcap`;
484 In most cases, this could and probably should be written as
486 system("cat /etc/termcap") == 0
487 or die "cat program failed!";
489 Which will get the output quickly (as its generated, instead of only
490 at the end ) and also check the return value.
492 system() also provides direct control over whether shell wildcard
493 processing may take place, whereas backticks do not.
495 =head2 How can I call backticks without shell processing?
497 This is a bit tricky. Instead of writing
499 @ok = `grep @opts '$search_string' @filenames`;
504 if (open(GREP, "-|")) {
511 exec 'grep', @opts, $search_string, @filenames;
514 Just as with system(), no shell escapes happen when you exec() a list.
516 =head2 Why can't my script read from STDIN after I gave it EOF (^D on Unix, ^Z on MS-DOS)?
518 Because some stdio's set error and eof flags that need clearing. The
519 POSIX module defines clearerr() that you can use. That is the
520 technically correct way to do it. Here are some less reliable
527 Try keeping around the seekpointer and go there, like this:
530 seek(LOG, $where, 0);
534 If that doesn't work, try seeking to a different part of the file and
539 If that doesn't work, try seeking to a different part of
540 the file, reading something, and then seeking back.
544 If that doesn't work, give up on your stdio package and use sysread.
548 =head2 How can I convert my shell script to perl?
550 Learn Perl and rewrite it. Seriously, there's no simple converter.
551 Things that are awkward to do in the shell are easy to do in Perl, and
552 this very awkwardness is what would make a shell->perl converter
553 nigh-on impossible to write. By rewriting it, you'll think about what
554 you're really trying to do, and hopefully will escape the shell's
555 pipeline datastream paradigm, which while convenient for some matters,
556 causes many inefficiencies.
558 =head2 Can I use perl to run a telnet or ftp session?
560 Try the Net::FTP, TCP::Client, and Net::Telnet modules (available from
561 CPAN). http://www.perl.com/CPAN/scripts/netstuff/telnet.emul.shar
562 will also help for emulating the telnet protocol, but Net::Telnet is
563 quite probably easier to use..
565 If all you want to do is pretend to be telnet but don't need
566 the initial telnet handshaking, then the standard dual-process
567 approach will suffice:
569 use IO::Socket; # new in 5.004
570 $handle = IO::Socket::INET->new('www.perl.com:80')
571 || die "can't connect to port 80 on www.perl.com: $!";
572 $handle->autoflush(1);
573 if (fork()) { # XXX: undef means failure
575 print while <STDIN>; # everything from stdin to socket
577 print while <$handle>; # everything from socket to stdout
582 =head2 How can I write expect in Perl?
584 Once upon a time, there was a library called chat2.pl (part of the
585 standard perl distribution), which never really got finished. These
586 days, your best bet is to look at the Comm.pl library available from
589 =head2 Is there a way to hide perl's command line from programs such as "ps"?
591 First of all note that if you're doing this for security reasons (to
592 avoid people seeing passwords, for example) then you should rewrite
593 your program so that critical information is never given as an
594 argument. Hiding the arguments won't make your program completely
597 To actually alter the visible command line, you can assign to the
598 variable $0 as documented in L<perlvar>. This won't work on all
599 operating systems, though. Daemon programs like sendmail place their
602 $0 = "orcus [accepting connections]";
604 =head2 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?
610 In the strictest sense, it can't be done -- the script executes as a
611 different process from the shell it was started from. Changes to a
612 process are not reflected in its parent, only in its own children
613 created after the change. There is shell magic that may allow you to
614 fake it by eval()ing the script's output in your shell; check out the
615 comp.unix.questions FAQ for details.
619 Change to %ENV persist after Perl exits, but directory changes do not.
623 =head2 How do I close a process's filehandle without waiting for it to complete?
625 Assuming your system supports such things, just send an appropriate signal
626 to the process (see L<perlfunc/"kill">. It's common to first send a TERM
627 signal, wait a little bit, and then send a KILL signal to finish it off.
629 =head2 How do I fork a daemon process?
631 If by daemon process you mean one that's detached (disassociated from
632 its tty), then the following process is reported to work on most
633 Unixish systems. Non-Unix users should check their Your_OS::Process
634 module for other solutions.
640 Open /dev/tty and use the the TIOCNOTTY ioctl on it. See L<tty(4)>
645 Change directory to /
649 Reopen STDIN, STDOUT, and STDERR so they're not connected to the old
654 Background yourself like this:
660 =head2 How do I make my program run with sh and csh?
662 See the F<eg/nih> script (part of the perl source distribution).
664 =head2 How do I find out if I'm running interactively or not?
666 Good question. Sometimes C<-t STDIN> and C<-t STDOUT> can give clues,
669 if (-t STDIN && -t STDOUT) {
673 On POSIX systems, you can test whether your own process group matches
674 the current process group of your controlling terminal as follows:
676 use POSIX qw/getpgrp tcgetpgrp/;
677 open(TTY, "/dev/tty") or die $!;
678 $tpgrp = tcgetpgrp(TTY);
680 if ($tpgrp == $pgrp) {
681 print "foreground\n";
683 print "background\n";
686 =head2 How do I timeout a slow event?
688 Use the alarm() function, probably in conjunction with a signal
689 handler, as documented L<perlipc/"Signals"> and chapter 6 of the
690 Camel. You may instead use the more flexible Sys::AlarmCall module
693 =head2 How do I set CPU limits?
695 Use the BSD::Resource module from CPAN.
697 =head2 How do I avoid zombies on a Unix system?
699 Use the reaper code from L<perlipc/"Signals"> to call wait() when a
700 SIGCHLD is received, or else use the double-fork technique described
703 =head2 How do I use an SQL database?
705 There are a number of excellent interfaces to SQL databases. See the
706 DBD::* modules available from
707 http://www.perl.com/CPAN/modules/dbperl/DBD .
709 =head2 How do I make a system() exit on control-C?
711 You can't. You need to imitate the system() call (see L<perlipc> for
712 sample code) and then have a signal handler for the INT signal that
713 passes the signal on to the subprocess.
715 =head2 How do I open a file without blocking?
717 If you're lucky enough to be using a system that supports
718 non-blocking reads (most Unixish systems do), you need only to use the
719 O_NDELAY or O_NONBLOCK flag from the Fcntl module in conjunction with
723 sysopen(FH, "/tmp/somefile", O_WRONLY|O_NDELAY|O_CREAT, 0644)
724 or die "can't open /tmp/somefile: $!":
726 =head2 How do I install a CPAN module?
728 The easiest way is to have the CPAN module do it for you. This module
729 comes with perl version 5.004 and later. To manually install the CPAN
730 module, or any well-behaved CPAN module for that matter, follow these
737 Unpack the source into a temporary area.
757 If your version of perl is compiled without dynamic loading, then you
758 just need to replace step 3 (B<make>) with B<make perl> and you will
759 get a new F<perl> binary with your extension linked in.
761 See L<ExtUtils::MakeMaker> for more details on building extensions,
762 the question "How do I keep my own module/library directory?"
764 =head2 How do I keep my own module/library directory?
766 When you build modules, use the PREFIX option when generating
769 perl Makefile.PL PREFIX=/u/mydir/perl
771 then either set the PERL5LIB environment variable before you run
772 scripts that use the modules/libraries (see L<perlrun>) or say
774 use lib '/u/mydir/perl';
776 See Perl's L<lib> for more information.
778 =head2 How do I add the directory my program lives in to the module/library search path?
781 use lib "$FindBin:Bin";
782 use your_own_modules;
784 =head2 How do I add a directory to my include path at runtime?
786 Here are the suggested ways of modifying your include path:
788 the PERLLIB environment variable
789 the PERL5LIB environment variable
790 the perl -Idir commpand line flag
791 the use lib pragma, as in
792 use lib "$ENV{HOME}/myown_perllib";
794 The latter is particularly useful because it knows about machine
795 dependent architectures. The lib.pm pragmatic module was first
796 included with the 5.002 release of Perl.
798 =head1 How do I get one key from the terminal at a time, under POSIX?
812 use POSIX qw(:termios_h);
814 my ($term, $oterm, $echo, $noecho, $fd_stdin);
816 $fd_stdin = fileno(STDIN);
818 $term = POSIX::Termios->new();
819 $term->getattr($fd_stdin);
820 $oterm = $term->getlflag();
822 $echo = ECHO | ECHOK | ICANON;
823 $noecho = $oterm & ~$echo;
826 $term->setlflag($noecho);
827 $term->setcc(VTIME, 1);
828 $term->setattr($fd_stdin, TCSANOW);
832 $term->setlflag($oterm);
833 $term->setcc(VTIME, 0);
834 $term->setattr($fd_stdin, TCSANOW);
840 sysread(STDIN, $key, 1);
848 =head1 AUTHOR AND COPYRIGHT
850 Copyright (c) 1997 Tom Christiansen and Nathan Torkington.
851 All rights reserved. See L<perlfaq> for distribution information.
853 echo x - perlfaq9.pod
854 sed 's/^X//' >perlfaq9.pod << 'END-of-perlfaq9.pod'
857 perlfaq9 - Networking ($Revision: 1.17 $, $Date: 1997/04/24 22:44:29 $)
861 This section deals with questions related to networking, the internet,
862 and a few on the web.
864 =head2 My CGI script runs from the command line but not the browser. Can you help me fix it?
866 Sure, but you probably can't afford our contracting rates :-)
868 Seriously, if you can demonstrate that you've read the following FAQs
869 and that your problem isn't something simple that can be easily
870 answered, you'll probably receive a courteous and useful reply to your
871 question if you post it on comp.infosystems.www.authoring.cgi (if it's
872 something to do with HTTP, HTML, or the CGI protocols). Questions that
873 appear to be Perl questions but are really CGI ones that are posted to
874 comp.lang.perl.misc may not be so well received.
878 http://www.perl.com/perl/faq/idiots-guide.html
879 http://www3.pair.com/webthing/docs/cgi/faqs/cgifaq.shtml
880 http://www.perl.com/perl/faq/perl-cgi-faq.html
881 http://www-genome.wi.mit.edu/WWW/faqs/www-security-faq.html
882 http://www.boutell.com/faq/
884 =head2 How do I remove HTML from a string?
886 The most correct way (albeit not the fastest) is to use HTML::Parse
887 from CPAN (part of the libwww-perl distribution, which is a must-have
888 module for all web hackers).
890 Many folks attempt a simple-minded regular expression approach, like
891 C<s/E<lt>.*?E<gt>//g>, but that fails in many cases because the tags
892 may continue over line breaks, they may contain quoted angle-brackets,
893 or HTML comment may be present. Plus folks forget to convert
894 entities, like C<<> for example.
896 Here's one "simple-minded" approach, that works for most files:
898 #!/usr/bin/perl -p0777
899 s/<(?:[^>'"]*|(['"]).*?\1)*>//gs
901 If you want a more complete solution, see the 3-stage striphtml
903 http://www.perl.com/CPAN/authors/Tom_Christiansen/scripts/striphtml.gz
906 =head2 How do I extract URLs?
908 A quick but imperfect approach is
911 # qxurl - tchrist@perl.com
912 print "$2\n" while m{
914 A \s+ HREF \s* = \s* (["']) (.*?) \1
918 This version does not adjust relative URLs, understand alternate
919 bases, deal with HTML comments, deal with HREF and NAME attributes in
920 the same tag, or accept URLs themselves as arguments. It also runs
921 about 100x faster than a more "complete" solution using the LWP suite
922 of modules, such as the
923 http://www.perl.com/CPAN/authors/Tom_Christiansen/scripts/xurl.gz
926 =head2 How do I download a file from the user's machine? How do I open a file on another machine?
928 In the context of an HTML form, you can use what's known as
929 B<multipart/form-data> encoding. The CGI.pm module (available from
930 CPAN) supports this in the start_multipart_form() method, which isn't
931 the same as the startform() method.
933 =head2 How do I make a pop-up menu in HTML?
935 Use the B<E<lt>SELECTE<gt>> and B<E<lt>OPTIONE<gt>> tags. The CGI.pm
936 module (available from CPAN) supports this widget, as well as many
937 others, including some that it cleverly synthesizes on its own.
939 =head2 How do I fetch an HTML file?
941 One approach, if you have the lynx text-based HTML browser installed
942 on your system, is this:
944 $html_code = `lynx -source $url`;
945 $text_data = `lynx -dump $url`;
947 The libwww-perl (LWP) modules from CPAN provide a more powerful way to
948 do this. They work through proxies, and don't require lynx:
950 # print HTML from a URL
952 getprint "http://www.sn.no/libwww-perl/";
954 # print ASCII from HTML from a URL
957 use HTML::FormatText;
959 $html = get("http://www.perl.com/");
961 or die "Can't fetch HTML from http://www.perl.com/";
962 $ascii = HTML::FormatText->new->format(parse_html($html));
965 =head2 how do I decode or create those %-encodings on the web?
967 Here's an example of decoding:
969 $string = "http://altavista.digital.com/cgi-bin/query?pg=q&what=news&fmt=.&q=%2Bcgi-bin+%2Bperl.exe";
970 $string =~ s/%([a-fA-F0-9]{2})/chr(hex($1))/ge;
972 Encoding is a bit harder, because you can't just blindly change
973 all the non-alphanumunder character (C<\W>) into their hex escapes.
974 It's important that characters with special meaning like C</> and C<?>
975 I<not> be translated. Probably the easiest way to get this right is
976 to avoid reinventing the wheel and just use the URI::Escape module,
977 which is part of the libwww-perl package (LWP) available from CPAN.
979 =head2 How do I redirect to another page?
981 Instead of sending back a C<Content-Type> as the headers of your
982 reply, send back a C<Location:> header. Officially this should be a
983 C<URI:> header, so the CGI.pm module (available from CPAN) sends back
986 Location: http://www.domain.com/newpage
987 URI: http://www.domain.com/newpage
989 Note that relative URLs in these headers can cause strange effects
990 because of "optimizations" that servers do.
992 =head2 How do I put a password on my web pages?
994 That depends. You'll need to read the documentation for your web
995 server, or perhaps check some of the other FAQs referenced above.
997 =head2 How do I edit my .htpasswd and .htgroup files with Perl?
999 The HTTPD::UserAdmin and HTTPD::GroupAdmin modules provide a
1000 consistent OO interface to these files, regardless of how they're
1001 stored. Databases may be text, dbm, Berkley DB or any database with a
1002 DBI compatible driver. HTTPD::UserAdmin supports files used by the
1003 `Basic' and `Digest' authentication schemes. Here's an example:
1005 use HTTPD::UserAdmin ();
1007 ->new(DB => "/foo/.htpasswd")
1008 ->add($username => $password);
1010 =head2 How do I make sure users can't enter values into a form that cause my CGI script to do bad things?
1012 Read the CGI security FAQ, at
1013 http://www-genome.wi.mit.edu/WWW/faqs/www-security-faq.html, and the
1015 http://www.perl.com/CPAN/doc/FAQs/cgi/perl-cgi-faq.html.
1017 In brief: use tainting (see L<perlsec>), which makes sure that data
1018 from outside your script (eg, CGI parameters) are never used in
1019 C<eval> or C<system> calls. In addition to tainting, never use the
1020 single-argument form of system() or exec(). Instead, supply the
1021 command and arguments as a list, which prevents shell globbing.
1023 =head2 How do I parse an email header?
1025 For a quick-and-dirty solution, try this solution derived
1026 from page 222 of the 2nd edition of "Programming Perl":
1030 $header =~ s/\n\s+/ /g; # merge continuation lines
1031 %head = ( UNIX_FROM_LINE, split /^([-\w]+):\s*/m, $header );
1033 That solution doesn't do well if, for example, you're trying to
1034 maintain all the Received lines. A more complete approach is to use
1035 the Mail::Header module from CPAN (part of the MailTools package).
1037 =head2 How do I decode a CGI form?
1039 A lot of people are tempted to code this up themselves, so you've
1040 probably all seen a lot of code involving C<$ENV{CONTENT_LENGTH}> and
1041 C<$ENV{QUERY_STRING}>. It's true that this can work, but there are
1042 also a lot of versions of this floating around that are quite simply
1045 Please do not be tempted to reinvent the wheel. Instead, use the
1046 CGI.pm or CGI_Lite.pm (available from CPAN), or if you're trapped in
1047 the module-free land of perl1 .. perl4, you might look into cgi-lib.pl
1048 (available from http://www.bio.cam.ac.uk/web/form.html).
1050 =head2 How do I check a valid email address?
1054 Without sending mail to the address and seeing whether it bounces (and
1055 even then you face the halting problem), you cannot determine whether
1056 an email address is valid. Even if you apply the email header
1057 standard, you can have problems, because there are deliverable
1058 addresses that aren't RFC-822 (the mail header standard) compliant,
1059 and addresses that aren't deliverable which are compliant.
1061 Many are tempted to try to eliminate many frequently-invalid email
1062 addresses with a simple regexp, such as
1063 C</^[\w.-]+\@([\w.-]\.)+\w+$/>. However, this also throws out many
1064 valid ones, and says nothing about potential deliverability, so is not
1065 suggested. Instead, see
1066 http://www.perl.com/CPAN/authors/Tom_Christiansen/scripts/ckaddr.gz ,
1067 which actually checks against the full RFC spec (except for nested
1068 comments), looks for addresses you may not wish to accept email to
1069 (say, Bill Clinton or your postmaster), and then makes sure that the
1070 hostname given can be looked up in DNS. It's not fast, but it works.
1072 Here's an alternative strategy used by many CGI script authors: Check
1073 the email address with a simple regexp (such as the one above). If
1074 the regexp matched the address, accept the address. If the regexp
1075 didn't match the address, request confirmation from the user that the
1076 email address they entered was correct.
1078 =head2 How do I decode a MIME/BASE64 string?
1080 The MIME-tools package (available from CPAN) handles this and a lot
1081 more. Decoding BASE64 becomes as simple as:
1084 $decoded = decode_base64($encoded);
1086 A more direct approach is to use the unpack() function's "u"
1087 format after minor transliterations:
1089 tr#A-Za-z0-9+/##cd; # remove non-base64 chars
1090 tr#A-Za-z0-9+/# -_#; # convert to uuencoded format
1091 $len = pack("c", 32 + 0.75*length); # compute length byte
1092 print unpack("u", $len . $_); # uudecode and print
1094 =head2 How do I return the user's email address?
1096 On systems that support getpwuid, the $E<lt> variable and the
1097 Sys::Hostname module (which is part of the standard perl distribution),
1098 you can probably try using something like this:
1101 $address = sprintf('%s@%s', getpwuid($<), hostname);
1103 Company policies on email address can mean that this generates addresses
1104 that the company's email system will not accept, so you should ask for
1105 users' email addresses when this matters. Furthermore, not all systems
1106 on which Perl runs are so forthcoming with this information as is Unix.
1108 The Mail::Util module from CPAN (part of the MailTools package) provides a
1109 mailaddress() function that tries to guess the mail address of the user.
1110 It makes a more intelligent guess than the code above, using information
1111 given when the module was installed, but it could still be incorrect.
1112 Again, the best way is often just to ask the user.
1114 =head2 How do I send/read mail?
1116 Sending mail: the Mail::Mailer module from CPAN (part of the MailTools
1117 package) is UNIX-centric, while Mail::Internet uses Net::SMTP which is
1118 not UNIX-centric. Reading mail: use the Mail::Folder module from CPAN
1119 (part of the MailFolder package) or the Mail::Internet module from
1120 CPAN (also part of the MailTools package).
1125 # say which mail host to use
1126 $ENV{SMTPHOSTS} = 'mail.frii.com';
1128 $header = new Mail::Header;
1129 $header->add('From', 'gnat@frii.com');
1130 $header->add('Subject', 'Testing');
1131 $header->add('To', 'gnat@frii.com');
1133 $body = 'This is a test, ignore';
1134 # create mail object
1135 $mail = new Mail::Internet(undef, Header => $header, Body => \[$body]);
1137 $mail->smtpsend or die;
1139 =head2 How do I find out my hostname/domainname/IP address?
1141 A lot of code has historically cavalierly called the C<`hostname`>
1142 program. While sometimes expedient, this isn't very portable. It's
1143 one of those tradeoffs of convenience versus portability.
1145 The Sys::Hostname module (part of the standard perl distribution) will
1146 give you the hostname after which you can find out the IP address
1147 (assuming you have working DNS) with a gethostbyname() call.
1151 my $host = hostname();
1152 my $addr = inet_ntoa(scalar(gethostbyname($name)) || 'localhost');
1154 Probably the simplest way to learn your DNS domain name is to grok
1155 it out of /etc/resolv.conf, at least under Unix. Of course, this
1156 assumes several things about your resolv.conf configuration, including
1159 (We still need a good DNS domain name-learning method for non-Unix
1162 =head2 How do I fetch a news article or the active newsgroups?
1164 Use the Net::NNTP or News::NNTPClient modules, both available from CPAN.
1165 This can make tasks like fetching the newsgroup list as simple as:
1167 perl -MNews::NNTPClient
1168 -e 'print News::NNTPClient->new->list("newsgroups")'
1170 =head2 How do I fetch/put an FTP file?
1172 LWP::Simple (available from CPAN) can fetch but not put. Net::FTP (also
1173 available from CPAN) is more complex but can put as well as fetch.
1175 =head2 How can I do RPC in Perl?
1177 A DCE::RPC module is being developed (but is not yet available), and
1178 will be released as part of the DCE-Perl package (available from
1179 CPAN). No ONC::RPC module is known.
1181 =head1 AUTHOR AND COPYRIGHT
1183 Copyright (c) 1997 Tom Christiansen and Nathan Torkington.
1184 All rights reserved. See L<perlfaq> for distribution information.