|Perl Language Reference Manual|
by Larry Wall and others
Paperback (6"x9"), 724 pages
RRP £29.95 ($39.95)
Sales of this book support The Perl Foundation! Get a printed copy>>>
28.1.7 Interprocess Communication (IPC)
In general, don't directly access the system in code meant to be
portable. That means, no
open with a
|, nor any of the other things
that makes being a perl hacker worth being.
Commands that launch external processes are generally supported on most platforms (though many of them do not support any type of forking). The problem with using them arises from what you invoke them on. External tools are often named differently on different platforms, may not be available in the same location, might accept different arguments, can behave differently, and often present their results in a platform-dependent way. Thus, you should seldom depend on them to produce consistent results. (Then again, if you're calling netstat -a, you probably don't expect it to run on both Unix and CP/M.)
One especially common bit of Perl code is opening a pipe to sendmail:
open(MAIL, '|/usr/lib/sendmail -t') or die "cannot fork sendmail: $!";
This is fine for systems programming when sendmail is known to be available. But it is not fine for many non-Unix systems, and even some Unix systems that may not have sendmail installed. If a portable solution is needed, see the various distributions on CPAN that deal with it. Mail::Mailer and Mail::Send in the MailTools distribution are commonly used, and provide several mailing methods, including mail, sendmail, and direct SMTP (via Net::SMTP) if a mail transfer agent is not available. Mail::Sendmail is a standalone module that provides simple, platform-independent mailing.
The Unix System V IPC (
msg*(), sem*(), shm*()) is not available
even on all Unix platforms.
Do not use either the bare result of
pack("N", 10, 20, 30, 40) or
bare v-strings (such as
v10.20.30.40) to represent IPv4 addresses:
both forms just pack the four bytes into network order. That this
would be equal to the C language
in_addr struct (which is what the
socket code internally uses) is not guaranteed. To be portable use
the routines of the Socket extension, such as
The rule of thumb for portable code is: Do it all in portable Perl, or use a module (that may internally implement it with platform-specific code, but expose a common interface).
|ISBN 9781906966027||Perl Language Reference Manual||See the print edition|