source: trunk/third/perl/pod/perlport.pod @ 20075

Revision 20075, 81.5 KB checked in by zacheiss, 21 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r20074, which included commits to RCS files with non-trunk default branches.
Line 
1=head1 NAME
2
3perlport - Writing portable Perl
4
5=head1 DESCRIPTION
6
7Perl runs on numerous operating systems.  While most of them share
8much in common, they also have their own unique features.
9
10This document is meant to help you to find out what constitutes portable
11Perl code.  That way once you make a decision to write portably,
12you know where the lines are drawn, and you can stay within them.
13
14There is a tradeoff between taking full advantage of one particular
15type of computer and taking advantage of a full range of them.
16Naturally, as you broaden your range and become more diverse, the
17common factors drop, and you are left with an increasingly smaller
18area of common ground in which you can operate to accomplish a
19particular task.  Thus, when you begin attacking a problem, it is
20important to consider under which part of the tradeoff curve you
21want to operate.  Specifically, you must decide whether it is
22important that the task that you are coding have the full generality
23of being portable, or whether to just get the job done right now.
24This is the hardest choice to be made.  The rest is easy, because
25Perl provides many choices, whichever way you want to approach your
26problem.
27
28Looking at it another way, writing portable code is usually about
29willfully limiting your available choices.  Naturally, it takes
30discipline and sacrifice to do that.  The product of portability
31and convenience may be a constant.  You have been warned.
32
33Be aware of two important points:
34
35=over 4
36
37=item Not all Perl programs have to be portable
38
39There is no reason you should not use Perl as a language to glue Unix
40tools together, or to prototype a Macintosh application, or to manage the
41Windows registry.  If it makes no sense to aim for portability for one
42reason or another in a given program, then don't bother.
43
44=item Nearly all of Perl already I<is> portable
45
46Don't be fooled into thinking that it is hard to create portable Perl
47code.  It isn't.  Perl tries its level-best to bridge the gaps between
48what's available on different platforms, and all the means available to
49use those features.  Thus almost all Perl code runs on any machine
50without modification.  But there are some significant issues in
51writing portable code, and this document is entirely about those issues.
52
53=back
54
55Here's the general rule: When you approach a task commonly done
56using a whole range of platforms, think about writing portable
57code.  That way, you don't sacrifice much by way of the implementation
58choices you can avail yourself of, and at the same time you can give
59your users lots of platform choices.  On the other hand, when you have to
60take advantage of some unique feature of a particular platform, as is
61often the case with systems programming (whether for Unix, Windows,
62S<Mac OS>, VMS, etc.), consider writing platform-specific code.
63
64When the code will run on only two or three operating systems, you
65may need to consider only the differences of those particular systems.
66The important thing is to decide where the code will run and to be
67deliberate in your decision.
68
69The material below is separated into three main sections: main issues of
70portability (L<"ISSUES">, platform-specific issues (L<"PLATFORMS">, and
71built-in perl functions that behave differently on various ports
72(L<"FUNCTION IMPLEMENTATIONS">.
73
74This information should not be considered complete; it includes possibly
75transient information about idiosyncrasies of some of the ports, almost
76all of which are in a state of constant evolution.  Thus, this material
77should be considered a perpetual work in progress
78(C<< <IMG SRC="yellow_sign.gif" ALT="Under Construction"> >>).
79
80=head1 ISSUES
81
82=head2 Newlines
83
84In most operating systems, lines in files are terminated by newlines.
85Just what is used as a newline may vary from OS to OS.  Unix
86traditionally uses C<\012>, one type of DOSish I/O uses C<\015\012>,
87and S<Mac OS> uses C<\015>.
88
89Perl uses C<\n> to represent the "logical" newline, where what is
90logical may depend on the platform in use.  In MacPerl, C<\n> always
91means C<\015>.  In DOSish perls, C<\n> usually means C<\012>, but
92when accessing a file in "text" mode, STDIO translates it to (or
93from) C<\015\012>, depending on whether you're reading or writing.
94Unix does the same thing on ttys in canonical mode.  C<\015\012>
95is commonly referred to as CRLF.
96
97A common cause of unportable programs is the misuse of chop() to trim
98newlines:
99
100    # XXX UNPORTABLE!
101    while(<FILE>) {
102        chop;
103        @array = split(/:/);
104        #...
105    }
106
107You can get away with this on Unix and Mac OS (they have a single
108character end-of-line), but the same program will break under DOSish
109perls because you're only chop()ing half the end-of-line.  Instead,
110chomp() should be used to trim newlines.  The Dunce::Files module can
111help audit your code for misuses of chop().
112
113When dealing with binary files (or text files in binary mode) be sure
114to explicitly set $/ to the appropriate value for your file format
115before using chomp().
116
117Because of the "text" mode translation, DOSish perls have limitations
118in using C<seek> and C<tell> on a file accessed in "text" mode.
119Stick to C<seek>-ing to locations you got from C<tell> (and no
120others), and you are usually free to use C<seek> and C<tell> even
121in "text" mode.  Using C<seek> or C<tell> or other file operations
122may be non-portable.  If you use C<binmode> on a file, however, you
123can usually C<seek> and C<tell> with arbitrary values in safety.
124
125A common misconception in socket programming is that C<\n> eq C<\012>
126everywhere.  When using protocols such as common Internet protocols,
127C<\012> and C<\015> are called for specifically, and the values of
128the logical C<\n> and C<\r> (carriage return) are not reliable.
129
130    print SOCKET "Hi there, client!\r\n";      # WRONG
131    print SOCKET "Hi there, client!\015\012";  # RIGHT
132
133However, using C<\015\012> (or C<\cM\cJ>, or C<\x0D\x0A>) can be tedious
134and unsightly, as well as confusing to those maintaining the code.  As
135such, the Socket module supplies the Right Thing for those who want it.
136
137    use Socket qw(:DEFAULT :crlf);
138    print SOCKET "Hi there, client!$CRLF"      # RIGHT
139
140When reading from a socket, remember that the default input record
141separator C<$/> is C<\n>, but robust socket code will recognize as
142either C<\012> or C<\015\012> as end of line:
143
144    while (<SOCKET>) {
145        # ...
146    }
147
148Because both CRLF and LF end in LF, the input record separator can
149be set to LF and any CR stripped later.  Better to write:
150
151    use Socket qw(:DEFAULT :crlf);
152    local($/) = LF;      # not needed if $/ is already \012
153
154    while (<SOCKET>) {
155        s/$CR?$LF/\n/;   # not sure if socket uses LF or CRLF, OK
156    #   s/\015?\012/\n/; # same thing
157    }
158
159This example is preferred over the previous one--even for Unix
160platforms--because now any C<\015>'s (C<\cM>'s) are stripped out
161(and there was much rejoicing).
162
163Similarly, functions that return text data--such as a function that
164fetches a web page--should sometimes translate newlines before
165returning the data, if they've not yet been translated to the local
166newline representation.  A single line of code will often suffice:
167
168    $data =~ s/\015?\012/\n/g;
169    return $data;
170
171Some of this may be confusing.  Here's a handy reference to the ASCII CR
172and LF characters.  You can print it out and stick it in your wallet.
173
174    LF  eq  \012  eq  \x0A  eq  \cJ  eq  chr(10)  eq  ASCII 10
175    CR  eq  \015  eq  \x0D  eq  \cM  eq  chr(13)  eq  ASCII 13
176
177             | Unix | DOS  | Mac  |
178        ---------------------------
179        \n   |  LF  |  LF  |  CR  |
180        \r   |  CR  |  CR  |  LF  |
181        \n * |  LF  | CRLF |  CR  |
182        \r * |  CR  |  CR  |  LF  |
183        ---------------------------
184        * text-mode STDIO
185
186The Unix column assumes that you are not accessing a serial line
187(like a tty) in canonical mode.  If you are, then CR on input becomes
188"\n", and "\n" on output becomes CRLF.
189
190These are just the most common definitions of C<\n> and C<\r> in Perl.
191There may well be others.  For example, on an EBCDIC implementation
192such as z/OS (OS/390) or OS/400 (using the ILE, the PASE is ASCII-based)
193the above material is similar to "Unix" but the code numbers change:
194
195    LF  eq  \025  eq  \x15  eq  \cU  eq  chr(21)  eq  CP-1047 21
196    LF  eq  \045  eq  \x25  eq           chr(37)  eq  CP-0037 37
197    CR  eq  \015  eq  \x0D  eq  \cM  eq  chr(13)  eq  CP-1047 13
198    CR  eq  \015  eq  \x0D  eq  \cM  eq  chr(13)  eq  CP-0037 13
199
200             | z/OS | OS/400 |
201        ----------------------
202        \n   |  LF  |  LF    |
203        \r   |  CR  |  CR    |
204        \n * |  LF  |  LF    |
205        \r * |  CR  |  CR    |
206        ----------------------
207        * text-mode STDIO
208
209=head2 Numbers endianness and Width
210
211Different CPUs store integers and floating point numbers in different
212orders (called I<endianness>) and widths (32-bit and 64-bit being the
213most common today).  This affects your programs when they attempt to transfer
214numbers in binary format from one CPU architecture to another,
215usually either "live" via network connection, or by storing the
216numbers to secondary storage such as a disk file or tape.
217
218Conflicting storage orders make utter mess out of the numbers.  If a
219little-endian host (Intel, VAX) stores 0x12345678 (305419896 in
220decimal), a big-endian host (Motorola, Sparc, PA) reads it as
2210x78563412 (2018915346 in decimal).  Alpha and MIPS can be either:
222Digital/Compaq used/uses them in little-endian mode; SGI/Cray uses
223them in big-endian mode.  To avoid this problem in network (socket)
224connections use the C<pack> and C<unpack> formats C<n> and C<N>, the
225"network" orders.  These are guaranteed to be portable.
226
227You can explore the endianness of your platform by unpacking a
228data structure packed in native format such as:
229
230    print unpack("h*", pack("s2", 1, 2)), "\n";
231    # '10002000' on e.g. Intel x86 or Alpha 21064 in little-endian mode
232    # '00100020' on e.g. Motorola 68040
233
234If you need to distinguish between endian architectures you could use
235either of the variables set like so:
236
237    $is_big_endian   = unpack("h*", pack("s", 1)) =~ /01/;
238    $is_little_endian = unpack("h*", pack("s", 1)) =~ /^1/;
239
240Differing widths can cause truncation even between platforms of equal
241endianness.  The platform of shorter width loses the upper parts of the
242number.  There is no good solution for this problem except to avoid
243transferring or storing raw binary numbers.
244
245One can circumnavigate both these problems in two ways.  Either
246transfer and store numbers always in text format, instead of raw
247binary, or else consider using modules like Data::Dumper (included in
248the standard distribution as of Perl 5.005) and Storable (included as
249of perl 5.8).  Keeping all data as text significantly simplifies matters.
250
251The v-strings are portable only up to v2147483647 (0x7FFFFFFF), that's
252how far EBCDIC, or more precisely UTF-EBCDIC will go.
253
254=head2 Files and Filesystems
255
256Most platforms these days structure files in a hierarchical fashion.
257So, it is reasonably safe to assume that all platforms support the
258notion of a "path" to uniquely identify a file on the system.  How
259that path is really written, though, differs considerably.
260
261Although similar, file path specifications differ between Unix,
262Windows, S<Mac OS>, OS/2, VMS, VOS, S<RISC OS>, and probably others.
263Unix, for example, is one of the few OSes that has the elegant idea
264of a single root directory.
265
266DOS, OS/2, VMS, VOS, and Windows can work similarly to Unix with C</>
267as path separator, or in their own idiosyncratic ways (such as having
268several root directories and various "unrooted" device files such NIL:
269and LPT:).
270
271S<Mac OS> uses C<:> as a path separator instead of C</>.
272
273The filesystem may support neither hard links (C<link>) nor
274symbolic links (C<symlink>, C<readlink>, C<lstat>).
275
276The filesystem may support neither access timestamp nor change
277timestamp (meaning that about the only portable timestamp is the
278modification timestamp), or one second granularity of any timestamps
279(e.g. the FAT filesystem limits the time granularity to two seconds).
280
281The "inode change timestamp" (the C<-C> filetest) may really be the
282"creation timestamp" (which it is not in UNIX).
283
284VOS perl can emulate Unix filenames with C</> as path separator.  The
285native pathname characters greater-than, less-than, number-sign, and
286percent-sign are always accepted.
287
288S<RISC OS> perl can emulate Unix filenames with C</> as path
289separator, or go native and use C<.> for path separator and C<:> to
290signal filesystems and disk names.
291
292Don't assume UNIX filesystem access semantics: that read, write,
293and execute are all the permissions there are, and even if they exist,
294that their semantics (for example what do r, w, and x mean on
295a directory) are the UNIX ones.  The various UNIX/POSIX compatibility
296layers usually try to make interfaces like chmod() work, but sometimes
297there simply is no good mapping.
298
299If all this is intimidating, have no (well, maybe only a little)
300fear.  There are modules that can help.  The File::Spec modules
301provide methods to do the Right Thing on whatever platform happens
302to be running the program.
303
304    use File::Spec::Functions;
305    chdir(updir());        # go up one directory
306    $file = catfile(curdir(), 'temp', 'file.txt');
307    # on Unix and Win32, './temp/file.txt'
308    # on Mac OS, ':temp:file.txt'
309    # on VMS, '[.temp]file.txt'
310
311File::Spec is available in the standard distribution as of version
3125.004_05.  File::Spec::Functions is only in File::Spec 0.7 and later,
313and some versions of perl come with version 0.6.  If File::Spec
314is not updated to 0.7 or later, you must use the object-oriented
315interface from File::Spec (or upgrade File::Spec).
316
317In general, production code should not have file paths hardcoded.
318Making them user-supplied or read from a configuration file is
319better, keeping in mind that file path syntax varies on different
320machines.
321
322This is especially noticeable in scripts like Makefiles and test suites,
323which often assume C</> as a path separator for subdirectories.
324
325Also of use is File::Basename from the standard distribution, which
326splits a pathname into pieces (base filename, full path to directory,
327and file suffix).
328
329Even when on a single platform (if you can call Unix a single platform),
330remember not to count on the existence or the contents of particular
331system-specific files or directories, like F</etc/passwd>,
332F</etc/sendmail.conf>, F</etc/resolv.conf>, or even F</tmp/>.  For
333example, F</etc/passwd> may exist but not contain the encrypted
334passwords, because the system is using some form of enhanced security.
335Or it may not contain all the accounts, because the system is using NIS.
336If code does need to rely on such a file, include a description of the
337file and its format in the code's documentation, then make it easy for
338the user to override the default location of the file.
339
340Don't assume a text file will end with a newline.  They should,
341but people forget.
342
343Do not have two files or directories of the same name with different
344case, like F<test.pl> and F<Test.pl>, as many platforms have
345case-insensitive (or at least case-forgiving) filenames.  Also, try
346not to have non-word characters (except for C<.>) in the names, and
347keep them to the 8.3 convention, for maximum portability, onerous a
348burden though this may appear.
349
350Likewise, when using the AutoSplit module, try to keep your functions to
3518.3 naming and case-insensitive conventions; or, at the least,
352make it so the resulting files have a unique (case-insensitively)
353first 8 characters.
354
355Whitespace in filenames is tolerated on most systems, but not all,
356and even on systems where it might be tolerated, some utilities
357might become confused by such whitespace.
358
359Many systems (DOS, VMS) cannot have more than one C<.> in their filenames.
360
361Don't assume C<< > >> won't be the first character of a filename.
362Always use C<< < >> explicitly to open a file for reading, or even
363better, use the three-arg version of open, unless you want the user to
364be able to specify a pipe open.
365
366    open(FILE, '<', $existing_file) or die $!;
367
368If filenames might use strange characters, it is safest to open it
369with C<sysopen> instead of C<open>.  C<open> is magic and can
370translate characters like C<< > >>, C<< < >>, and C<|>, which may
371be the wrong thing to do.  (Sometimes, though, it's the right thing.)
372Three-arg open can also help protect against this translation in cases
373where it is undesirable.
374
375Don't use C<:> as a part of a filename since many systems use that for
376their own semantics (Mac OS Classic for separating pathname components,
377many networking schemes and utilities for separating the nodename and
378the pathname, and so on).  For the same reasons, avoid C<@>, C<;> and
379C<|>.
380
381Don't assume that in pathnames you can collapse two leading slashes
382C<//> into one: some networking and clustering filesystems have special
383semantics for that.  Let the operating system to sort it out.
384
385The I<portable filename characters> as defined by ANSI C are
386
387 a b c d e f g h i j k l m n o p q r t u v w x y z
388 A B C D E F G H I J K L M N O P Q R T U V W X Y Z
389 0 1 2 3 4 5 6 7 8 9
390 . _ -
391
392and the "-" shouldn't be the first character.  If you want to be
393hypercorrect, stay case-insensitive and within the 8.3 naming
394convention (all the files and directories have to be unique within one
395directory if their names are lowercased and truncated to eight
396characters before the C<.>, if any, and to three characters after the
397C<.>, if any).  (And do not use C<.>s in directory names.)
398
399=head2 System Interaction
400
401Not all platforms provide a command line.  These are usually platforms
402that rely primarily on a Graphical User Interface (GUI) for user
403interaction.  A program requiring a command line interface might
404not work everywhere.  This is probably for the user of the program
405to deal with, so don't stay up late worrying about it.
406
407Some platforms can't delete or rename files held open by the system,
408this limitation may also apply to changing filesystem metainformation
409like file permissions or owners.  Remember to C<close> files when you
410are done with them.  Don't C<unlink> or C<rename> an open file.  Don't
411C<tie> or C<open> a file already tied or opened; C<untie> or C<close>
412it first.
413
414Don't open the same file more than once at a time for writing, as some
415operating systems put mandatory locks on such files.
416
417Don't assume that write/modify permission on a directory gives the
418right to add or delete files/directories in that directory.  That is
419filesystem specific: in some filesystems you need write/modify
420permission also (or even just) in the file/directory itself.  In some
421filesystems (AFS, DFS) the permission to add/delete directory entries
422is a completely separate permission.
423
424Don't assume that a single C<unlink> completely gets rid of the file:
425some filesystems (most notably the ones in VMS) have versioned
426filesystems, and unlink() removes only the most recent one (it doesn't
427remove all the versions because by default the native tools on those
428platforms remove just the most recent version, too).  The portable
429idiom to remove all the versions of a file is
430
431    1 while unlink "file";
432
433This will terminate if the file is undeleteable for some reason
434(protected, not there, and so on).
435
436Don't count on a specific environment variable existing in C<%ENV>.
437Don't count on C<%ENV> entries being case-sensitive, or even
438case-preserving.  Don't try to clear %ENV by saying C<%ENV = ();>, or,
439if you really have to, make it conditional on C<$^O ne 'VMS'> since in
440VMS the C<%ENV> table is much more than a per-process key-value string
441table.
442
443Don't count on signals or C<%SIG> for anything.
444
445Don't count on filename globbing.  Use C<opendir>, C<readdir>, and
446C<closedir> instead.
447
448Don't count on per-program environment variables, or per-program current
449directories.
450
451Don't count on specific values of C<$!>, neither numeric nor
452especially the strings values-- users may switch their locales causing
453error messages to be translated into their languages.  If you can
454trust a POSIXish environment, you can portably use the symbols defined
455by the Errno module, like ENOENT.  And don't trust on the values of C<$!>
456at all except immediately after a failed system call.
457
458=head2 Command names versus file pathnames
459
460Don't assume that the name used to invoke a command or program with
461C<system> or C<exec> can also be used to test for the existence of the
462file that holds the executable code for that command or program.
463First, many systems have "internal" commands that are built-in to the
464shell or OS and while these commands can be invoked, there is no
465corresponding file.  Second, some operating systems (e.g., Cygwin,
466DJGPP, OS/2, and VOS) have required suffixes for executable files;
467these suffixes are generally permitted on the command name but are not
468required.  Thus, a command like "perl" might exist in a file named
469"perl", "perl.exe", or "perl.pm", depending on the operating system.
470The variable "_exe" in the Config module holds the executable suffix,
471if any.  Third, the VMS port carefully sets up $^X and
472$Config{perlpath} so that no further processing is required.  This is
473just as well, because the matching regular expression used below would
474then have to deal with a possible trailing version number in the VMS
475file name.
476
477To convert $^X to a file pathname, taking account of the requirements
478of the various operating system possibilities, say:
479  use Config;
480  $thisperl = $^X;
481  if ($^O ne 'VMS')
482     {$thisperl .= $Config{_exe} unless $thisperl =~ m/$Config{_exe}$/i;}
483
484To convert $Config{perlpath} to a file pathname, say:
485  use Config;
486  $thisperl = $Config{perlpath};
487  if ($^O ne 'VMS')
488     {$thisperl .= $Config{_exe} unless $thisperl =~ m/$Config{_exe}$/i;}
489
490=head2 Networking
491
492Don't assume that you can reach the public Internet.
493
494Don't assume that there is only one way to get through firewalls
495to the public Internet.
496
497Don't assume that you can reach outside world through any other port
498than 80, or some web proxy.  ftp is blocked by many firewalls.
499
500Don't assume that you can send email by connecting to the local SMTP port.
501
502Don't assume that you can reach yourself or any node by the name
503'localhost'.  The same goes for '127.0.0.1'.  You will have to try both.
504
505Don't assume that the host has only one network card, or that it
506can't bind to many virtual IP addresses.
507
508Don't assume a particular network device name.
509
510Don't assume a particular set of ioctl()s will work.
511
512Don't assume that you can ping hosts and get replies.
513
514Don't assume that any particular port (service) will respond.
515
516Don't assume that Sys::Hostname() (or any other API or command)
517returns either a fully qualified hostname or a non-qualified hostname:
518it all depends on how the system had been configured.  Also remember
519things like DHCP and NAT-- the hostname you get back might not be very
520useful.
521
522All the above "don't":s may look daunting, and they are -- but the key
523is to degrade gracefully if one cannot reach the particular network
524service one wants.  Croaking or hanging do not look very professional.
525
526=head2 Interprocess Communication (IPC)
527
528In general, don't directly access the system in code meant to be
529portable.  That means, no C<system>, C<exec>, C<fork>, C<pipe>,
530C<``>, C<qx//>, C<open> with a C<|>, nor any of the other things
531that makes being a perl hacker worth being.
532
533Commands that launch external processes are generally supported on
534most platforms (though many of them do not support any type of
535forking).  The problem with using them arises from what you invoke
536them on.  External tools are often named differently on different
537platforms, may not be available in the same location, might accept
538different arguments, can behave differently, and often present their
539results in a platform-dependent way.  Thus, you should seldom depend
540on them to produce consistent results. (Then again, if you're calling
541I<netstat -a>, you probably don't expect it to run on both Unix and CP/M.)
542
543One especially common bit of Perl code is opening a pipe to B<sendmail>:
544
545    open(MAIL, '|/usr/lib/sendmail -t')
546        or die "cannot fork sendmail: $!";
547
548This is fine for systems programming when sendmail is known to be
549available.  But it is not fine for many non-Unix systems, and even
550some Unix systems that may not have sendmail installed.  If a portable
551solution is needed, see the various distributions on CPAN that deal
552with it.  Mail::Mailer and Mail::Send in the MailTools distribution are
553commonly used, and provide several mailing methods, including mail,
554sendmail, and direct SMTP (via Net::SMTP) if a mail transfer agent is
555not available.  Mail::Sendmail is a standalone module that provides
556simple, platform-independent mailing.
557
558The Unix System V IPC (C<msg*(), sem*(), shm*()>) is not available
559even on all Unix platforms.
560
561Do not use either the bare result of C<pack("N", 10, 20, 30, 40)> or
562bare v-strings (such as C<v10.20.30.40>) to represent IPv4 addresses:
563both forms just pack the four bytes into network order.  That this
564would be equal to the C language C<in_addr> struct (which is what the
565socket code internally uses) is not guaranteed.  To be portable use
566the routines of the Socket extension, such as C<inet_aton()>,
567C<inet_ntoa()>, and C<sockaddr_in()>.
568
569The rule of thumb for portable code is: Do it all in portable Perl, or
570use a module (that may internally implement it with platform-specific
571code, but expose a common interface).
572
573=head2 External Subroutines (XS)
574
575XS code can usually be made to work with any platform, but dependent
576libraries, header files, etc., might not be readily available or
577portable, or the XS code itself might be platform-specific, just as Perl
578code might be.  If the libraries and headers are portable, then it is
579normally reasonable to make sure the XS code is portable, too.
580
581A different type of portability issue arises when writing XS code:
582availability of a C compiler on the end-user's system.  C brings
583with it its own portability issues, and writing XS code will expose
584you to some of those.  Writing purely in Perl is an easier way to
585achieve portability.
586
587=head2 Standard Modules
588
589In general, the standard modules work across platforms.  Notable
590exceptions are the CPAN module (which currently makes connections to external
591programs that may not be available), platform-specific modules (like
592ExtUtils::MM_VMS), and DBM modules.
593
594There is no one DBM module available on all platforms.
595SDBM_File and the others are generally available on all Unix and DOSish
596ports, but not in MacPerl, where only NBDM_File and DB_File are
597available.
598
599The good news is that at least some DBM module should be available, and
600AnyDBM_File will use whichever module it can find.  Of course, then
601the code needs to be fairly strict, dropping to the greatest common
602factor (e.g., not exceeding 1K for each record), so that it will
603work with any DBM module.  See L<AnyDBM_File> for more details.
604
605=head2 Time and Date
606
607The system's notion of time of day and calendar date is controlled in
608widely different ways.  Don't assume the timezone is stored in C<$ENV{TZ}>,
609and even if it is, don't assume that you can control the timezone through
610that variable.  Don't assume anything about the three-letter timezone
611abbreviations (for example that MST would be the Mountain Standard Time,
612it's been known to stand for Moscow Standard Time).  If you need to
613use timezones, express them in some unambiguous format like the
614exact number of minutes offset from UTC, or the POSIX timezone
615format.
616
617Don't assume that the epoch starts at 00:00:00, January 1, 1970,
618because that is OS- and implementation-specific.  It is better to
619store a date in an unambiguous representation.  The ISO 8601 standard
620defines YYYY-MM-DD as the date format, or YYYY-MM-DDTHH-MM-SS
621(that's a literal "T" separating the date from the time).
622Please do use the ISO 8601 instead of making us to guess what
623date 02/03/04 might be.  ISO 8601 even sorts nicely as-is.
624A text representation (like "1987-12-18") can be easily converted
625into an OS-specific value using a module like Date::Parse.
626An array of values, such as those returned by C<localtime>, can be
627converted to an OS-specific representation using Time::Local.
628
629When calculating specific times, such as for tests in time or date modules,
630it may be appropriate to calculate an offset for the epoch.
631
632    require Time::Local;
633    $offset = Time::Local::timegm(0, 0, 0, 1, 0, 70);
634
635The value for C<$offset> in Unix will be C<0>, but in Mac OS will be
636some large number.  C<$offset> can then be added to a Unix time value
637to get what should be the proper value on any system.
638
639On Windows (at least), you shouldn't pass a negative value to C<gmtime> or
640C<localtime>.
641
642=head2 Character sets and character encoding
643
644Assume very little about character sets.
645
646Assume nothing about numerical values (C<ord>, C<chr>) of characters.
647Do not use explicit code point ranges (like \xHH-\xHH); use for
648example symbolic character classes like C<[:print:]>.
649
650Do not assume that the alphabetic characters are encoded contiguously
651(in the numeric sense).  There may be gaps.
652
653Do not assume anything about the ordering of the characters.
654The lowercase letters may come before or after the uppercase letters;
655the lowercase and uppercase may be interlaced so that both `a' and `A'
656come before `b'; the accented and other international characters may
657be interlaced so that E<auml> comes before `b'.
658
659=head2 Internationalisation
660
661If you may assume POSIX (a rather large assumption), you may read
662more about the POSIX locale system from L<perllocale>.  The locale
663system at least attempts to make things a little bit more portable,
664or at least more convenient and native-friendly for non-English
665users.  The system affects character sets and encoding, and date
666and time formatting--amongst other things.
667
668If you really want to be international, you should consider Unicode.
669See L<perluniintro> and L<perlunicode> for more information.
670
671If you want to use non-ASCII bytes (outside the bytes 0x00..0x7f) in
672the "source code" of your code, to be portable you have to be explicit
673about what bytes they are.  Someone might for example be using your
674code under a UTF-8 locale, in which case random native bytes might be
675illegal ("Malformed UTF-8 ...")  This means that for example embedding
676ISO 8859-1 bytes beyond 0x7f into your strings might cause trouble
677later.  If the bytes are native 8-bit bytes, you can use the C<bytes>
678pragma.  If the bytes are in a string (regular expression being a
679curious string), you can often also use the C<\xHH> notation instead
680of embedding the bytes as-is.  If they are in some particular legacy
681encoding (ether single-byte or something more complicated), you can
682use the C<encoding> pragma.  (If you want to write your code in UTF-8,
683you can use either the C<utf8> pragma, or the C<encoding> pragma.)
684The C<bytes> and C<utf8> pragmata are available since Perl 5.6.0, and
685the C<encoding> pragma since Perl 5.8.0.
686
687=head2 System Resources
688
689If your code is destined for systems with severely constrained (or
690missing!) virtual memory systems then you want to be I<especially> mindful
691of avoiding wasteful constructs such as:
692
693    # NOTE: this is no longer "bad" in perl5.005
694    for (0..10000000) {}                       # bad
695    for (my $x = 0; $x <= 10000000; ++$x) {}   # good
696
697    @lines = <VERY_LARGE_FILE>;                # bad
698
699    while (<FILE>) {$file .= $_}               # sometimes bad
700    $file = join('', <FILE>);                  # better
701
702The last two constructs may appear unintuitive to most people.  The
703first repeatedly grows a string, whereas the second allocates a
704large chunk of memory in one go.  On some systems, the second is
705more efficient that the first.
706
707=head2 Security
708
709Most multi-user platforms provide basic levels of security, usually
710implemented at the filesystem level.  Some, however, do
711not-- unfortunately.  Thus the notion of user id, or "home" directory,
712or even the state of being logged-in, may be unrecognizable on many
713platforms.  If you write programs that are security-conscious, it
714is usually best to know what type of system you will be running
715under so that you can write code explicitly for that platform (or
716class of platforms).
717
718Don't assume the UNIX filesystem access semantics: the operating
719system or the filesystem may be using some ACL systems, which are
720richer languages than the usual rwx.  Even if the rwx exist,
721their semantics might be different.
722
723(From security viewpoint testing for permissions before attempting to
724do something is silly anyway: if one tries this, there is potential
725for race conditions-- someone or something might change the
726permissions between the permissions check and the actual operation.
727Just try the operation.)
728
729Don't assume the UNIX user and group semantics: especially, don't
730expect the C<< $< >> and C<< $> >> (or the C<$(> and C<$)>) to work
731for switching identities (or memberships).
732
733Don't assume set-uid and set-gid semantics. (And even if you do,
734think twice: set-uid and set-gid are a known can of security worms.)
735
736=head2 Style
737
738For those times when it is necessary to have platform-specific code,
739consider keeping the platform-specific code in one place, making porting
740to other platforms easier.  Use the Config module and the special
741variable C<$^O> to differentiate platforms, as described in
742L<"PLATFORMS">.
743
744Be careful in the tests you supply with your module or programs.
745Module code may be fully portable, but its tests might not be.  This
746often happens when tests spawn off other processes or call external
747programs to aid in the testing, or when (as noted above) the tests
748assume certain things about the filesystem and paths.  Be careful not
749to depend on a specific output style for errors, such as when checking
750C<$!> after a failed system call.  Using C<$!> for anything else than
751displaying it as output is doubtful (though see the Errno module for
752testing reasonably portably for error value). Some platforms expect
753a certain output format, and Perl on those platforms may have been
754adjusted accordingly.  Most specifically, don't anchor a regex when
755testing an error value.
756
757=head1 CPAN Testers
758
759Modules uploaded to CPAN are tested by a variety of volunteers on
760different platforms.  These CPAN testers are notified by mail of each
761new upload, and reply to the list with PASS, FAIL, NA (not applicable to
762this platform), or UNKNOWN (unknown), along with any relevant notations.
763
764The purpose of the testing is twofold: one, to help developers fix any
765problems in their code that crop up because of lack of testing on other
766platforms; two, to provide users with information about whether
767a given module works on a given platform.
768
769=over 4
770
771=item Mailing list: cpan-testers@perl.org
772
773=item Testing results: http://testers.cpan.org/
774
775=back
776
777=head1 PLATFORMS
778
779As of version 5.002, Perl is built with a C<$^O> variable that
780indicates the operating system it was built on.  This was implemented
781to help speed up code that would otherwise have to C<use Config>
782and use the value of C<$Config{osname}>.  Of course, to get more
783detailed information about the system, looking into C<%Config> is
784certainly recommended.
785
786C<%Config> cannot always be trusted, however, because it was built
787at compile time.  If perl was built in one place, then transferred
788elsewhere, some values may be wrong.  The values may even have been
789edited after the fact.
790
791=head2 Unix
792
793Perl works on a bewildering variety of Unix and Unix-like platforms (see
794e.g. most of the files in the F<hints/> directory in the source code kit).
795On most of these systems, the value of C<$^O> (hence C<$Config{'osname'}>,
796too) is determined either by lowercasing and stripping punctuation from the
797first field of the string returned by typing C<uname -a> (or a similar command)
798at the shell prompt or by testing the file system for the presence of
799uniquely named files such as a kernel or header file.  Here, for example,
800are a few of the more popular Unix flavors:
801
802    uname         $^O        $Config{'archname'}
803    --------------------------------------------
804    AIX           aix        aix
805    BSD/OS        bsdos      i386-bsdos
806    Darwin        darwin     darwin
807    dgux          dgux       AViiON-dgux
808    DYNIX/ptx     dynixptx   i386-dynixptx
809    FreeBSD       freebsd    freebsd-i386   
810    Linux         linux      arm-linux
811    Linux         linux      i386-linux
812    Linux         linux      i586-linux
813    Linux         linux      ppc-linux
814    HP-UX         hpux       PA-RISC1.1
815    IRIX          irix       irix
816    Mac OS X      darwin     darwin
817    MachTen PPC   machten    powerpc-machten
818    NeXT 3        next       next-fat
819    NeXT 4        next       OPENSTEP-Mach
820    openbsd       openbsd    i386-openbsd
821    OSF1          dec_osf    alpha-dec_osf
822    reliantunix-n svr4       RM400-svr4
823    SCO_SV        sco_sv     i386-sco_sv
824    SINIX-N       svr4       RM400-svr4
825    sn4609        unicos     CRAY_C90-unicos
826    sn6521        unicosmk   t3e-unicosmk
827    sn9617        unicos     CRAY_J90-unicos
828    SunOS         solaris    sun4-solaris
829    SunOS         solaris    i86pc-solaris
830    SunOS4        sunos      sun4-sunos
831
832Because the value of C<$Config{archname}> may depend on the
833hardware architecture, it can vary more than the value of C<$^O>.
834
835=head2 DOS and Derivatives
836
837Perl has long been ported to Intel-style microcomputers running under
838systems like PC-DOS, MS-DOS, OS/2, and most Windows platforms you can
839bring yourself to mention (except for Windows CE, if you count that).
840Users familiar with I<COMMAND.COM> or I<CMD.EXE> style shells should
841be aware that each of these file specifications may have subtle
842differences:
843
844    $filespec0 = "c:/foo/bar/file.txt";
845    $filespec1 = "c:\\foo\\bar\\file.txt";
846    $filespec2 = 'c:\foo\bar\file.txt';
847    $filespec3 = 'c:\\foo\\bar\\file.txt';
848
849System calls accept either C</> or C<\> as the path separator.
850However, many command-line utilities of DOS vintage treat C</> as
851the option prefix, so may get confused by filenames containing C</>.
852Aside from calling any external programs, C</> will work just fine,
853and probably better, as it is more consistent with popular usage,
854and avoids the problem of remembering what to backwhack and what
855not to.
856
857The DOS FAT filesystem can accommodate only "8.3" style filenames.  Under
858the "case-insensitive, but case-preserving" HPFS (OS/2) and NTFS (NT)
859filesystems you may have to be careful about case returned with functions
860like C<readdir> or used with functions like C<open> or C<opendir>.
861
862DOS also treats several filenames as special, such as AUX, PRN,
863NUL, CON, COM1, LPT1, LPT2, etc.  Unfortunately, sometimes these
864filenames won't even work if you include an explicit directory
865prefix.  It is best to avoid such filenames, if you want your code
866to be portable to DOS and its derivatives.  It's hard to know what
867these all are, unfortunately.
868
869Users of these operating systems may also wish to make use of
870scripts such as I<pl2bat.bat> or I<pl2cmd> to
871put wrappers around your scripts.
872
873Newline (C<\n>) is translated as C<\015\012> by STDIO when reading from
874and writing to files (see L<"Newlines">).  C<binmode(FILEHANDLE)>
875will keep C<\n> translated as C<\012> for that filehandle.  Since it is a
876no-op on other systems, C<binmode> should be used for cross-platform code
877that deals with binary data.  That's assuming you realize in advance
878that your data is in binary.  General-purpose programs should
879often assume nothing about their data.
880
881The C<$^O> variable and the C<$Config{archname}> values for various
882DOSish perls are as follows:
883
884     OS            $^O      $Config{archname}   ID    Version
885     --------------------------------------------------------
886     MS-DOS        dos        ?                 
887     PC-DOS        dos        ?                 
888     OS/2          os2        ?
889     Windows 3.1   ?          ?                 0      3 01
890     Windows 95    MSWin32    MSWin32-x86       1      4 00
891     Windows 98    MSWin32    MSWin32-x86       1      4 10
892     Windows ME    MSWin32    MSWin32-x86       1      ?
893     Windows NT    MSWin32    MSWin32-x86       2      4 xx
894     Windows NT    MSWin32    MSWin32-ALPHA     2      4 xx
895     Windows NT    MSWin32    MSWin32-ppc       2      4 xx
896     Windows 2000  MSWin32    MSWin32-x86       2      5 xx
897     Windows XP    MSWin32    MSWin32-x86       2      ?
898     Windows CE    MSWin32    ?                 3           
899     Cygwin        cygwin     ?                 
900
901The various MSWin32 Perl's can distinguish the OS they are running on
902via the value of the fifth element of the list returned from
903Win32::GetOSVersion().  For example:
904
905    if ($^O eq 'MSWin32') {
906        my @os_version_info = Win32::GetOSVersion();
907        print +('3.1','95','NT')[$os_version_info[4]],"\n";
908    }
909
910There are also Win32::IsWinNT() and Win32::IsWin95(), try C<perldoc Win32>,
911and as of libwin32 0.19 (not part of the core Perl distribution)
912Win32::GetOSName().  The very portable POSIX::uname() will work too:
913
914    c:\> perl -MPOSIX -we "print join '|', uname"
915    Windows NT|moonru|5.0|Build 2195 (Service Pack 2)|x86
916
917Also see:
918
919=over 4
920
921=item *
922
923The djgpp environment for DOS, http://www.delorie.com/djgpp/
924and L<perldos>.
925
926=item *
927
928The EMX environment for DOS, OS/2, etc. emx@iaehv.nl,
929http://www.leo.org/pub/comp/os/os2/leo/gnu/emx+gcc/index.html or
930ftp://hobbes.nmsu.edu/pub/os2/dev/emx/  Also L<perlos2>.
931
932=item *
933
934Build instructions for Win32 in L<perlwin32>, or under the Cygnus environment
935in L<perlcygwin>. 
936
937=item *
938
939The C<Win32::*> modules in L<Win32>.
940
941=item *
942
943The ActiveState Pages, http://www.activestate.com/
944
945=item *
946
947The Cygwin environment for Win32; F<README.cygwin> (installed
948as L<perlcygwin>), http://www.cygwin.com/
949
950=item *
951
952The U/WIN environment for Win32,
953http://www.research.att.com/sw/tools/uwin/
954
955=item *
956
957Build instructions for OS/2, L<perlos2>
958
959=back
960
961=head2 S<Mac OS>
962
963Any module requiring XS compilation is right out for most people, because
964MacPerl is built using non-free (and non-cheap!) compilers.  Some XS
965modules that can work with MacPerl are built and distributed in binary
966form on CPAN.
967
968Directories are specified as:
969
970    volume:folder:file              for absolute pathnames
971    volume:folder:                  for absolute pathnames
972    :folder:file                    for relative pathnames
973    :folder:                        for relative pathnames
974    :file                           for relative pathnames
975    file                            for relative pathnames
976
977Files are stored in the directory in alphabetical order.  Filenames are
978limited to 31 characters, and may include any character except for
979null and C<:>, which is reserved as the path separator.
980
981Instead of C<flock>, see C<FSpSetFLock> and C<FSpRstFLock> in the
982Mac::Files module, or C<chmod(0444, ...)> and C<chmod(0666, ...)>.
983
984In the MacPerl application, you can't run a program from the command line;
985programs that expect C<@ARGV> to be populated can be edited with something
986like the following, which brings up a dialog box asking for the command
987line arguments.
988
989    if (!@ARGV) {
990        @ARGV = split /\s+/, MacPerl::Ask('Arguments?');
991    }
992
993A MacPerl script saved as a "droplet" will populate C<@ARGV> with the full
994pathnames of the files dropped onto the script.
995
996Mac users can run programs under a type of command line interface
997under MPW (Macintosh Programmer's Workshop, a free development
998environment from Apple).  MacPerl was first introduced as an MPW
999tool, and MPW can be used like a shell:
1000
1001    perl myscript.plx some arguments
1002
1003ToolServer is another app from Apple that provides access to MPW tools
1004from MPW and the MacPerl app, which allows MacPerl programs to use
1005C<system>, backticks, and piped C<open>.
1006
1007"S<Mac OS>" is the proper name for the operating system, but the value
1008in C<$^O> is "MacOS".  To determine architecture, version, or whether
1009the application or MPW tool version is running, check:
1010
1011    $is_app    = $MacPerl::Version =~ /App/;
1012    $is_tool   = $MacPerl::Version =~ /MPW/;
1013    ($version) = $MacPerl::Version =~ /^(\S+)/;
1014    $is_ppc    = $MacPerl::Architecture eq 'MacPPC';
1015    $is_68k    = $MacPerl::Architecture eq 'Mac68K';
1016
1017S<Mac OS X>, based on NeXT's OpenStep OS, runs MacPerl natively, under the
1018"Classic" environment.  There is no "Carbon" version of MacPerl to run
1019under the primary Mac OS X environment.  S<Mac OS X> and its Open Source
1020version, Darwin, both run Unix perl natively.
1021
1022Also see:
1023
1024=over 4
1025
1026=item *
1027
1028MacPerl Development, http://dev.macperl.org/ .
1029
1030=item *
1031
1032The MacPerl Pages, http://www.macperl.com/ .
1033
1034=item *
1035
1036The MacPerl mailing lists, http://lists.perl.org/ .
1037
1038=back
1039
1040=head2 VMS
1041
1042Perl on VMS is discussed in L<perlvms> in the perl distribution.
1043Perl on VMS can accept either VMS- or Unix-style file
1044specifications as in either of the following:
1045
1046    $ perl -ne "print if /perl_setup/i" SYS$LOGIN:LOGIN.COM
1047    $ perl -ne "print if /perl_setup/i" /sys$login/login.com
1048
1049but not a mixture of both as in:
1050
1051    $ perl -ne "print if /perl_setup/i" sys$login:/login.com
1052    Can't open sys$login:/login.com: file specification syntax error
1053
1054Interacting with Perl from the Digital Command Language (DCL) shell
1055often requires a different set of quotation marks than Unix shells do.
1056For example:
1057
1058    $ perl -e "print ""Hello, world.\n"""
1059    Hello, world.
1060
1061There are several ways to wrap your perl scripts in DCL F<.COM> files, if
1062you are so inclined.  For example:
1063
1064    $ write sys$output "Hello from DCL!"
1065    $ if p1 .eqs. ""
1066    $ then perl -x 'f$environment("PROCEDURE")
1067    $ else perl -x - 'p1 'p2 'p3 'p4 'p5 'p6 'p7 'p8
1068    $ deck/dollars="__END__"
1069    #!/usr/bin/perl
1070
1071    print "Hello from Perl!\n";
1072
1073    __END__
1074    $ endif
1075
1076Do take care with C<$ ASSIGN/nolog/user SYS$COMMAND: SYS$INPUT> if your
1077perl-in-DCL script expects to do things like C<< $read = <STDIN>; >>.
1078
1079Filenames are in the format "name.extension;version".  The maximum
1080length for filenames is 39 characters, and the maximum length for
1081extensions is also 39 characters.  Version is a number from 1 to
108232767.  Valid characters are C</[A-Z0-9$_-]/>.
1083
1084VMS's RMS filesystem is case-insensitive and does not preserve case.
1085C<readdir> returns lowercased filenames, but specifying a file for
1086opening remains case-insensitive.  Files without extensions have a
1087trailing period on them, so doing a C<readdir> with a file named F<A.;5>
1088will return F<a.> (though that file could be opened with
1089C<open(FH, 'A')>).
1090
1091RMS had an eight level limit on directory depths from any rooted logical
1092(allowing 16 levels overall) prior to VMS 7.2.  Hence
1093C<PERL_ROOT:[LIB.2.3.4.5.6.7.8]> is a valid directory specification but
1094C<PERL_ROOT:[LIB.2.3.4.5.6.7.8.9]> is not.  F<Makefile.PL> authors might
1095have to take this into account, but at least they can refer to the former
1096as C</PERL_ROOT/lib/2/3/4/5/6/7/8/>.
1097
1098The VMS::Filespec module, which gets installed as part of the build
1099process on VMS, is a pure Perl module that can easily be installed on
1100non-VMS platforms and can be helpful for conversions to and from RMS
1101native formats.
1102
1103What C<\n> represents depends on the type of file opened.  It usually
1104represents C<\012> but it could also be C<\015>, C<\012>, C<\015\012>,
1105C<\000>, C<\040>, or nothing depending on the file organiztion and
1106record format.  The VMS::Stdio module provides access to the
1107special fopen() requirements of files with unusual attributes on VMS.
1108
1109TCP/IP stacks are optional on VMS, so socket routines might not be
1110implemented.  UDP sockets may not be supported.
1111
1112The value of C<$^O> on OpenVMS is "VMS".  To determine the architecture
1113that you are running on without resorting to loading all of C<%Config>
1114you can examine the content of the C<@INC> array like so:
1115
1116    if (grep(/VMS_AXP/, @INC)) {
1117        print "I'm on Alpha!\n";
1118
1119    } elsif (grep(/VMS_VAX/, @INC)) {
1120        print "I'm on VAX!\n";
1121
1122    } else {
1123        print "I'm not so sure about where $^O is...\n";
1124    }
1125
1126On VMS, perl determines the UTC offset from the C<SYS$TIMEZONE_DIFFERENTIAL>
1127logical name.  Although the VMS epoch began at 17-NOV-1858 00:00:00.00,
1128calls to C<localtime> are adjusted to count offsets from
112901-JAN-1970 00:00:00.00, just like Unix.
1130
1131Also see:
1132
1133=over 4
1134
1135=item *
1136
1137F<README.vms> (installed as L<README_vms>), L<perlvms>
1138
1139=item *
1140
1141vmsperl list, majordomo@perl.org
1142
1143(Put the words C<subscribe vmsperl> in message body.)
1144
1145=item *
1146
1147vmsperl on the web, http://www.sidhe.org/vmsperl/index.html
1148
1149=back
1150
1151=head2 VOS
1152
1153Perl on VOS is discussed in F<README.vos> in the perl distribution
1154(installed as L<perlvos>).  Perl on VOS can accept either VOS- or
1155Unix-style file specifications as in either of the following:
1156
1157    C<< $ perl -ne "print if /perl_setup/i" >system>notices >>
1158    C<< $ perl -ne "print if /perl_setup/i" /system/notices >>
1159
1160or even a mixture of both as in:
1161
1162    C<< $ perl -ne "print if /perl_setup/i" >system/notices >>
1163
1164Even though VOS allows the slash character to appear in object
1165names, because the VOS port of Perl interprets it as a pathname
1166delimiting character, VOS files, directories, or links whose names
1167contain a slash character cannot be processed.  Such files must be
1168renamed before they can be processed by Perl.  Note that VOS limits
1169file names to 32 or fewer characters.
1170
1171Perl on VOS can be built using two different compilers and two different
1172versions of the POSIX runtime.  The recommended method for building full
1173Perl is with the GNU C compiler and the generally-available version of
1174VOS POSIX support.  See F<README.vos> (installed as L<perlvos>) for
1175restrictions that apply when Perl is built using the VOS Standard C
1176compiler or the alpha version of VOS POSIX support.
1177
1178The value of C<$^O> on VOS is "VOS".  To determine the architecture that
1179you are running on without resorting to loading all of C<%Config> you
1180can examine the content of the @INC array like so:
1181
1182    if ($^O =~ /VOS/) {
1183        print "I'm on a Stratus box!\n";
1184    } else {
1185        print "I'm not on a Stratus box!\n";
1186        die;
1187    }
1188
1189    if (grep(/860/, @INC)) {
1190        print "This box is a Stratus XA/R!\n";
1191
1192    } elsif (grep(/7100/, @INC)) {
1193        print "This box is a Stratus HP 7100 or 8xxx!\n";
1194
1195    } elsif (grep(/8000/, @INC)) {
1196        print "This box is a Stratus HP 8xxx!\n";
1197
1198    } else {
1199        print "This box is a Stratus 68K!\n";
1200    }
1201
1202Also see:
1203
1204=over 4
1205
1206=item *
1207
1208F<README.vos> (installed as L<perlvos>)
1209
1210=item *
1211
1212The VOS mailing list.
1213
1214There is no specific mailing list for Perl on VOS.  You can post
1215comments to the comp.sys.stratus newsgroup, or subscribe to the general
1216Stratus mailing list.  Send a letter with "subscribe Info-Stratus" in
1217the message body to majordomo@list.stratagy.com.
1218
1219=item *
1220
1221VOS Perl on the web at http://ftp.stratus.com/pub/vos/posix/posix.html
1222
1223=back
1224
1225=head2 EBCDIC Platforms
1226
1227Recent versions of Perl have been ported to platforms such as OS/400 on
1228AS/400 minicomputers as well as OS/390, VM/ESA, and BS2000 for S/390
1229Mainframes.  Such computers use EBCDIC character sets internally (usually
1230Character Code Set ID 0037 for OS/400 and either 1047 or POSIX-BC for S/390
1231systems).  On the mainframe perl currently works under the "Unix system
1232services for OS/390" (formerly known as OpenEdition), VM/ESA OpenEdition, or
1233the BS200 POSIX-BC system (BS2000 is supported in perl 5.6 and greater).
1234See L<perlos390> for details.  Note that for OS/400 there is also a port of
1235Perl 5.8.1/5.9.0 or later to the PASE which is ASCII-based (as opposed to
1236ILE which is EBCDIC-based), see L<perlos400>.
1237
1238As of R2.5 of USS for OS/390 and Version 2.3 of VM/ESA these Unix
1239sub-systems do not support the C<#!> shebang trick for script invocation.
1240Hence, on OS/390 and VM/ESA perl scripts can be executed with a header
1241similar to the following simple script:
1242
1243    : # use perl
1244        eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}'
1245            if 0;
1246    #!/usr/local/bin/perl     # just a comment really
1247
1248    print "Hello from perl!\n";
1249
1250OS/390 will support the C<#!> shebang trick in release 2.8 and beyond.
1251Calls to C<system> and backticks can use POSIX shell syntax on all
1252S/390 systems.
1253
1254On the AS/400, if PERL5 is in your library list, you may need
1255to wrap your perl scripts in a CL procedure to invoke them like so:
1256
1257    BEGIN
1258      CALL PGM(PERL5/PERL) PARM('/QOpenSys/hello.pl')
1259    ENDPGM
1260
1261This will invoke the perl script F<hello.pl> in the root of the
1262QOpenSys file system.  On the AS/400 calls to C<system> or backticks
1263must use CL syntax.
1264
1265On these platforms, bear in mind that the EBCDIC character set may have
1266an effect on what happens with some perl functions (such as C<chr>,
1267C<pack>, C<print>, C<printf>, C<ord>, C<sort>, C<sprintf>, C<unpack>), as
1268well as bit-fiddling with ASCII constants using operators like C<^>, C<&>
1269and C<|>, not to mention dealing with socket interfaces to ASCII computers
1270(see L<"Newlines">).
1271
1272Fortunately, most web servers for the mainframe will correctly
1273translate the C<\n> in the following statement to its ASCII equivalent
1274(C<\r> is the same under both Unix and OS/390 & VM/ESA):
1275
1276    print "Content-type: text/html\r\n\r\n";
1277
1278The values of C<$^O> on some of these platforms includes:
1279
1280    uname         $^O        $Config{'archname'}
1281    --------------------------------------------
1282    OS/390        os390      os390
1283    OS400         os400      os400
1284    POSIX-BC      posix-bc   BS2000-posix-bc
1285    VM/ESA        vmesa      vmesa
1286
1287Some simple tricks for determining if you are running on an EBCDIC
1288platform could include any of the following (perhaps all):
1289
1290    if ("\t" eq "\05")   { print "EBCDIC may be spoken here!\n"; }
1291
1292    if (ord('A') == 193) { print "EBCDIC may be spoken here!\n"; }
1293
1294    if (chr(169) eq 'z') { print "EBCDIC may be spoken here!\n"; }
1295
1296One thing you may not want to rely on is the EBCDIC encoding
1297of punctuation characters since these may differ from code page to code
1298page (and once your module or script is rumoured to work with EBCDIC,
1299folks will want it to work with all EBCDIC character sets).
1300
1301Also see:
1302
1303=over 4
1304
1305=item *
1306
1307*
1308
1309L<perlos390>, F<README.os390>, F<perlbs2000>, F<README.vmesa>,
1310L<perlebcdic>.
1311
1312=item *
1313
1314The perl-mvs@perl.org list is for discussion of porting issues as well as
1315general usage issues for all EBCDIC Perls.  Send a message body of
1316"subscribe perl-mvs" to majordomo@perl.org.
1317
1318=item  *
1319
1320AS/400 Perl information at
1321http://as400.rochester.ibm.com/
1322as well as on CPAN in the F<ports/> directory.
1323
1324=back
1325
1326=head2 Acorn RISC OS
1327
1328Because Acorns use ASCII with newlines (C<\n>) in text files as C<\012> like
1329Unix, and because Unix filename emulation is turned on by default,
1330most simple scripts will probably work "out of the box".  The native
1331filesystem is modular, and individual filesystems are free to be
1332case-sensitive or insensitive, and are usually case-preserving.  Some
1333native filesystems have name length limits, which file and directory
1334names are silently truncated to fit.  Scripts should be aware that the
1335standard filesystem currently has a name length limit of B<10>
1336characters, with up to 77 items in a directory, but other filesystems
1337may not impose such limitations.
1338
1339Native filenames are of the form
1340
1341    Filesystem#Special_Field::DiskName.$.Directory.Directory.File
1342
1343where
1344
1345    Special_Field is not usually present, but may contain . and $ .
1346    Filesystem =~ m|[A-Za-z0-9_]|
1347    DsicName   =~ m|[A-Za-z0-9_/]|
1348    $ represents the root directory
1349    . is the path separator
1350    @ is the current directory (per filesystem but machine global)
1351    ^ is the parent directory
1352    Directory and File =~ m|[^\0- "\.\$\%\&:\@\\^\|\177]+|
1353
1354The default filename translation is roughly C<tr|/.|./|;>
1355
1356Note that C<"ADFS::HardDisk.$.File" ne 'ADFS::HardDisk.$.File'> and that
1357the second stage of C<$> interpolation in regular expressions will fall
1358foul of the C<$.> if scripts are not careful.
1359
1360Logical paths specified by system variables containing comma-separated
1361search lists are also allowed; hence C<System:Modules> is a valid
1362filename, and the filesystem will prefix C<Modules> with each section of
1363C<System$Path> until a name is made that points to an object on disk.
1364Writing to a new file C<System:Modules> would be allowed only if
1365C<System$Path> contains a single item list.  The filesystem will also
1366expand system variables in filenames if enclosed in angle brackets, so
1367C<< <System$Dir>.Modules >> would look for the file
1368S<C<$ENV{'System$Dir'} . 'Modules'>>.  The obvious implication of this is
1369that B<fully qualified filenames can start with C<< <> >>> and should
1370be protected when C<open> is used for input.
1371
1372Because C<.> was in use as a directory separator and filenames could not
1373be assumed to be unique after 10 characters, Acorn implemented the C
1374compiler to strip the trailing C<.c> C<.h> C<.s> and C<.o> suffix from
1375filenames specified in source code and store the respective files in
1376subdirectories named after the suffix.  Hence files are translated:
1377
1378    foo.h           h.foo
1379    C:foo.h         C:h.foo        (logical path variable)
1380    sys/os.h        sys.h.os       (C compiler groks Unix-speak)
1381    10charname.c    c.10charname
1382    10charname.o    o.10charname
1383    11charname_.c   c.11charname   (assuming filesystem truncates at 10)
1384
1385The Unix emulation library's translation of filenames to native assumes
1386that this sort of translation is required, and it allows a user-defined list
1387of known suffixes that it will transpose in this fashion.  This may
1388seem transparent, but consider that with these rules C<foo/bar/baz.h>
1389and C<foo/bar/h/baz> both map to C<foo.bar.h.baz>, and that C<readdir> and
1390C<glob> cannot and do not attempt to emulate the reverse mapping.  Other
1391C<.>'s in filenames are translated to C</>.
1392
1393As implied above, the environment accessed through C<%ENV> is global, and
1394the convention is that program specific environment variables are of the
1395form C<Program$Name>.  Each filesystem maintains a current directory,
1396and the current filesystem's current directory is the B<global> current
1397directory.  Consequently, sociable programs don't change the current
1398directory but rely on full pathnames, and programs (and Makefiles) cannot
1399assume that they can spawn a child process which can change the current
1400directory without affecting its parent (and everyone else for that
1401matter).
1402
1403Because native operating system filehandles are global and are currently
1404allocated down from 255, with 0 being a reserved value, the Unix emulation
1405library emulates Unix filehandles.  Consequently, you can't rely on
1406passing C<STDIN>, C<STDOUT>, or C<STDERR> to your children.
1407
1408The desire of users to express filenames of the form
1409C<< <Foo$Dir>.Bar >> on the command line unquoted causes problems,
1410too: C<``> command output capture has to perform a guessing game.  It
1411assumes that a string C<< <[^<>]+\$[^<>]> >> is a
1412reference to an environment variable, whereas anything else involving
1413C<< < >> or C<< > >> is redirection, and generally manages to be 99%
1414right.  Of course, the problem remains that scripts cannot rely on any
1415Unix tools being available, or that any tools found have Unix-like command
1416line arguments.
1417
1418Extensions and XS are, in theory, buildable by anyone using free
1419tools.  In practice, many don't, as users of the Acorn platform are
1420used to binary distributions.  MakeMaker does run, but no available
1421make currently copes with MakeMaker's makefiles; even if and when
1422this should be fixed, the lack of a Unix-like shell will cause
1423problems with makefile rules, especially lines of the form C<cd
1424sdbm && make all>, and anything using quoting.
1425
1426"S<RISC OS>" is the proper name for the operating system, but the value
1427in C<$^O> is "riscos" (because we don't like shouting).
1428
1429=head2 Other perls
1430
1431Perl has been ported to many platforms that do not fit into any of
1432the categories listed above.  Some, such as AmigaOS, Atari MiNT,
1433BeOS, HP MPE/iX, QNX, Plan 9, and VOS, have been well-integrated
1434into the standard Perl source code kit.  You may need to see the
1435F<ports/> directory on CPAN for information, and possibly binaries,
1436for the likes of: aos, Atari ST, lynxos, riscos, Novell Netware,
1437Tandem Guardian, I<etc.>  (Yes, we know that some of these OSes may
1438fall under the Unix category, but we are not a standards body.)
1439
1440Some approximate operating system names and their C<$^O> values
1441in the "OTHER" category include:
1442
1443    OS            $^O        $Config{'archname'}
1444    ------------------------------------------
1445    Amiga DOS     amigaos    m68k-amigos
1446    BeOS          beos
1447    MPE/iX        mpeix      PA-RISC1.1
1448
1449See also:
1450
1451=over 4
1452
1453=item *
1454
1455Amiga, F<README.amiga> (installed as L<perlamiga>).
1456
1457=item *
1458
1459Atari, F<README.mint> and Guido Flohr's web page
1460http://stud.uni-sb.de/~gufl0000/
1461
1462=item *
1463
1464Be OS, F<README.beos>
1465
1466=item *
1467
1468HP 300 MPE/iX, F<README.mpeix> and Mark Bixby's web page
1469http://www.bixby.org/mark/perlix.html
1470
1471=item *
1472
1473A free perl5-based PERL.NLM for Novell Netware is available in
1474precompiled binary and source code form from http://www.novell.com/
1475as well as from CPAN.
1476
1477=item  *
1478
1479S<Plan 9>, F<README.plan9>
1480
1481=back
1482
1483=head1 FUNCTION IMPLEMENTATIONS
1484
1485Listed below are functions that are either completely unimplemented
1486or else have been implemented differently on various platforms.
1487Following each description will be, in parentheses, a list of
1488platforms that the description applies to.
1489
1490The list may well be incomplete, or even wrong in some places.  When
1491in doubt, consult the platform-specific README files in the Perl
1492source distribution, and any other documentation resources accompanying
1493a given port.
1494
1495Be aware, moreover, that even among Unix-ish systems there are variations.
1496
1497For many functions, you can also query C<%Config>, exported by
1498default from the Config module.  For example, to check whether the
1499platform has the C<lstat> call, check C<$Config{d_lstat}>.  See
1500L<Config> for a full description of available variables.
1501
1502=head2 Alphabetical Listing of Perl Functions
1503
1504=over 8
1505
1506=item -X FILEHANDLE
1507
1508=item -X EXPR
1509
1510=item -X
1511
1512C<-r>, C<-w>, and C<-x> have a limited meaning only; directories
1513and applications are executable, and there are no uid/gid
1514considerations.  C<-o> is not supported.  (S<Mac OS>)
1515
1516C<-r>, C<-w>, C<-x>, and C<-o> tell whether the file is accessible,
1517which may not reflect UIC-based file protections.  (VMS)
1518
1519C<-s> returns the size of the data fork, not the total size of data fork
1520plus resource fork.  (S<Mac OS>).
1521
1522C<-s> by name on an open file will return the space reserved on disk,
1523rather than the current extent.  C<-s> on an open filehandle returns the
1524current size.  (S<RISC OS>)
1525
1526C<-R>, C<-W>, C<-X>, C<-O> are indistinguishable from C<-r>, C<-w>,
1527C<-x>, C<-o>. (S<Mac OS>, Win32, VMS, S<RISC OS>)
1528
1529C<-b>, C<-c>, C<-k>, C<-g>, C<-p>, C<-u>, C<-A> are not implemented.
1530(S<Mac OS>)
1531
1532C<-g>, C<-k>, C<-l>, C<-p>, C<-u>, C<-A> are not particularly meaningful.
1533(Win32, VMS, S<RISC OS>)
1534
1535C<-d> is true if passed a device spec without an explicit directory.
1536(VMS)
1537
1538C<-T> and C<-B> are implemented, but might misclassify Mac text files
1539with foreign characters; this is the case will all platforms, but may
1540affect S<Mac OS> often.  (S<Mac OS>)
1541
1542C<-x> (or C<-X>) determine if a file ends in one of the executable
1543suffixes.  C<-S> is meaningless.  (Win32)
1544
1545C<-x> (or C<-X>) determine if a file has an executable file type.
1546(S<RISC OS>)
1547
1548=item binmode FILEHANDLE
1549
1550Meaningless.  (S<Mac OS>, S<RISC OS>)
1551
1552Reopens file and restores pointer; if function fails, underlying
1553filehandle may be closed, or pointer may be in a different position.
1554(VMS)
1555
1556The value returned by C<tell> may be affected after the call, and
1557the filehandle may be flushed. (Win32)
1558
1559=item chmod LIST
1560
1561Only limited meaning.  Disabling/enabling write permission is mapped to
1562locking/unlocking the file. (S<Mac OS>)
1563
1564Only good for changing "owner" read-write access, "group", and "other"
1565bits are meaningless. (Win32)
1566
1567Only good for changing "owner" and "other" read-write access. (S<RISC OS>)
1568
1569Access permissions are mapped onto VOS access-control list changes. (VOS)
1570
1571The actual permissions set depend on the value of the C<CYGWIN>
1572in the SYSTEM environment settings.  (Cygwin)
1573
1574=item chown LIST
1575
1576Not implemented. (S<Mac OS>, Win32, S<Plan 9>, S<RISC OS>, VOS)
1577
1578Does nothing, but won't fail. (Win32)
1579
1580=item chroot FILENAME
1581
1582=item chroot
1583
1584Not implemented. (S<Mac OS>, Win32, VMS, S<Plan 9>, S<RISC OS>, VOS, VM/ESA)
1585
1586=item crypt PLAINTEXT,SALT
1587
1588May not be available if library or source was not provided when building
1589perl. (Win32)
1590
1591Not implemented. (VOS)
1592
1593=item dbmclose HASH
1594
1595Not implemented. (VMS, S<Plan 9>, VOS)
1596
1597=item dbmopen HASH,DBNAME,MODE
1598
1599Not implemented. (VMS, S<Plan 9>, VOS)
1600
1601=item dump LABEL
1602
1603Not useful. (S<Mac OS>, S<RISC OS>)
1604
1605Not implemented. (Win32)
1606
1607Invokes VMS debugger. (VMS)
1608
1609=item exec LIST
1610
1611Not implemented. (S<Mac OS>)
1612
1613Implemented via Spawn. (VM/ESA)
1614
1615Does not automatically flush output handles on some platforms.
1616(SunOS, Solaris, HP-UX)
1617
1618=item exit EXPR
1619
1620=item exit
1621
1622Emulates UNIX exit() (which considers C<exit 1> to indicate an error) by
1623mapping the C<1> to SS$_ABORT (C<44>).  This behavior may be overridden
1624with the pragma C<use vmsish 'exit'>.  As with the CRTL's exit()
1625function, C<exit 0> is also mapped to an exit status of SS$_NORMAL
1626(C<1>); this mapping cannot be overridden.  Any other argument to exit()
1627is used directly as Perl's exit status. (VMS)
1628
1629=item fcntl FILEHANDLE,FUNCTION,SCALAR
1630
1631Not implemented. (Win32, VMS)
1632
1633=item flock FILEHANDLE,OPERATION
1634
1635Not implemented (S<Mac OS>, VMS, S<RISC OS>, VOS).
1636
1637Available only on Windows NT (not on Windows 95). (Win32)
1638
1639=item fork
1640
1641Not implemented. (S<Mac OS>, AmigaOS, S<RISC OS>, VOS, VM/ESA, VMS)
1642
1643Emulated using multiple interpreters.  See L<perlfork>.  (Win32)
1644
1645Does not automatically flush output handles on some platforms.
1646(SunOS, Solaris, HP-UX)
1647
1648=item getlogin
1649
1650Not implemented. (S<Mac OS>, S<RISC OS>)
1651
1652=item getpgrp PID
1653
1654Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>, VOS)
1655
1656=item getppid
1657
1658Not implemented. (S<Mac OS>, Win32, S<RISC OS>)
1659
1660=item getpriority WHICH,WHO
1661
1662Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>, VOS, VM/ESA)
1663
1664=item getpwnam NAME
1665
1666Not implemented. (S<Mac OS>, Win32)
1667
1668Not useful. (S<RISC OS>)
1669
1670=item getgrnam NAME
1671
1672Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>)
1673
1674=item getnetbyname NAME
1675
1676Not implemented. (S<Mac OS>, Win32, S<Plan 9>)
1677
1678=item getpwuid UID
1679
1680Not implemented. (S<Mac OS>, Win32)
1681
1682Not useful. (S<RISC OS>)
1683
1684=item getgrgid GID
1685
1686Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>)
1687
1688=item getnetbyaddr ADDR,ADDRTYPE
1689
1690Not implemented. (S<Mac OS>, Win32, S<Plan 9>)
1691
1692=item getprotobynumber NUMBER
1693
1694Not implemented. (S<Mac OS>)
1695
1696=item getservbyport PORT,PROTO
1697
1698Not implemented. (S<Mac OS>)
1699
1700=item getpwent
1701
1702Not implemented. (S<Mac OS>, Win32, VM/ESA)
1703
1704=item getgrent
1705
1706Not implemented. (S<Mac OS>, Win32, VMS, VM/ESA)
1707
1708=item gethostbyname
1709
1710C<gethostbyname('localhost')> does not work everywhere: you may have
1711to use C<gethostbyname('127.0.0.1')>. (S<Mac OS>, S<Irix 5>)
1712
1713=item gethostent
1714
1715Not implemented. (S<Mac OS>, Win32)
1716
1717=item getnetent
1718
1719Not implemented. (S<Mac OS>, Win32, S<Plan 9>)
1720
1721=item getprotoent
1722
1723Not implemented. (S<Mac OS>, Win32, S<Plan 9>)
1724
1725=item getservent
1726
1727Not implemented. (Win32, S<Plan 9>)
1728
1729=item sethostent STAYOPEN
1730
1731Not implemented. (S<Mac OS>, Win32, S<Plan 9>, S<RISC OS>)
1732
1733=item setnetent STAYOPEN
1734
1735Not implemented. (S<Mac OS>, Win32, S<Plan 9>, S<RISC OS>)
1736
1737=item setprotoent STAYOPEN
1738
1739Not implemented. (S<Mac OS>, Win32, S<Plan 9>, S<RISC OS>)
1740
1741=item setservent STAYOPEN
1742
1743Not implemented. (S<Plan 9>, Win32, S<RISC OS>)
1744
1745=item endpwent
1746
1747Not implemented. (S<Mac OS>, MPE/iX, VM/ESA, Win32)
1748
1749=item endgrent
1750
1751Not implemented. (S<Mac OS>, MPE/iX, S<RISC OS>, VM/ESA, VMS, Win32)
1752
1753=item endhostent
1754
1755Not implemented. (S<Mac OS>, Win32)
1756
1757=item endnetent
1758
1759Not implemented. (S<Mac OS>, Win32, S<Plan 9>)
1760
1761=item endprotoent
1762
1763Not implemented. (S<Mac OS>, Win32, S<Plan 9>)
1764
1765=item endservent
1766
1767Not implemented. (S<Plan 9>, Win32)
1768
1769=item getsockopt SOCKET,LEVEL,OPTNAME
1770
1771Not implemented. (S<Plan 9>)
1772
1773=item glob EXPR
1774
1775=item glob
1776
1777This operator is implemented via the File::Glob extension on most
1778platforms.  See L<File::Glob> for portability information.
1779
1780=item ioctl FILEHANDLE,FUNCTION,SCALAR
1781
1782Not implemented. (VMS)
1783
1784Available only for socket handles, and it does what the ioctlsocket() call
1785in the Winsock API does. (Win32)
1786
1787Available only for socket handles. (S<RISC OS>)
1788
1789=item kill SIGNAL, LIST
1790
1791C<kill(0, LIST)> is implemented for the sake of taint checking;
1792use with other signals is unimplemented. (S<Mac OS>)
1793
1794Not implemented, hence not useful for taint checking. (S<RISC OS>)
1795
1796C<kill()> doesn't have the semantics of C<raise()>, i.e. it doesn't send
1797a signal to the identified process like it does on Unix platforms.
1798Instead C<kill($sig, $pid)> terminates the process identified by $pid,
1799and makes it exit immediately with exit status $sig.  As in Unix, if
1800$sig is 0 and the specified process exists, it returns true without
1801actually terminating it. (Win32)
1802
1803=item link OLDFILE,NEWFILE
1804
1805Not implemented. (S<Mac OS>, MPE/iX, VMS, S<RISC OS>)
1806
1807Link count not updated because hard links are not quite that hard
1808(They are sort of half-way between hard and soft links). (AmigaOS)
1809
1810Hard links are implemented on Win32 (Windows NT and Windows 2000)
1811under NTFS only.
1812
1813=item lstat FILEHANDLE
1814
1815=item lstat EXPR
1816
1817=item lstat
1818
1819Not implemented. (VMS, S<RISC OS>)
1820
1821Return values (especially for device and inode) may be bogus. (Win32)
1822
1823=item msgctl ID,CMD,ARG
1824
1825=item msgget KEY,FLAGS
1826
1827=item msgsnd ID,MSG,FLAGS
1828
1829=item msgrcv ID,VAR,SIZE,TYPE,FLAGS
1830
1831Not implemented. (S<Mac OS>, Win32, VMS, S<Plan 9>, S<RISC OS>, VOS)
1832
1833=item open FILEHANDLE,EXPR
1834
1835=item open FILEHANDLE
1836
1837The C<|> variants are supported only if ToolServer is installed.
1838(S<Mac OS>)
1839
1840open to C<|-> and C<-|> are unsupported. (S<Mac OS>, Win32, S<RISC OS>)
1841
1842Opening a process does not automatically flush output handles on some
1843platforms.  (SunOS, Solaris, HP-UX)
1844
1845=item pipe READHANDLE,WRITEHANDLE
1846
1847Very limited functionality. (MiNT)
1848
1849=item readlink EXPR
1850
1851=item readlink
1852
1853Not implemented. (Win32, VMS, S<RISC OS>)
1854
1855=item select RBITS,WBITS,EBITS,TIMEOUT
1856
1857Only implemented on sockets. (Win32, VMS)
1858
1859Only reliable on sockets. (S<RISC OS>)
1860
1861Note that the C<select FILEHANDLE> form is generally portable.
1862
1863=item semctl ID,SEMNUM,CMD,ARG
1864
1865=item semget KEY,NSEMS,FLAGS
1866
1867=item semop KEY,OPSTRING
1868
1869Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>, VOS)
1870
1871=item setgrent
1872
1873Not implemented. (S<Mac OS>, MPE/iX, VMS, Win32, S<RISC OS>)
1874
1875=item setpgrp PID,PGRP
1876
1877Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>, VOS)
1878
1879=item setpriority WHICH,WHO,PRIORITY
1880
1881Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>, VOS)
1882
1883=item setpwent
1884
1885Not implemented. (S<Mac OS>, MPE/iX, Win32, S<RISC OS>)
1886
1887=item setsockopt SOCKET,LEVEL,OPTNAME,OPTVAL
1888
1889Not implemented. (S<Plan 9>)
1890
1891=item shmctl ID,CMD,ARG
1892
1893=item shmget KEY,SIZE,FLAGS
1894
1895=item shmread ID,VAR,POS,SIZE
1896
1897=item shmwrite ID,STRING,POS,SIZE
1898
1899Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>, VOS)
1900
1901=item sockatmark SOCKET
1902
1903A relatively recent addition to socket functions, may not
1904be implemented even in UNIX platforms.
1905
1906=item socketpair SOCKET1,SOCKET2,DOMAIN,TYPE,PROTOCOL
1907
1908Not implemented. (Win32, VMS, S<RISC OS>, VOS, VM/ESA)
1909
1910=item stat FILEHANDLE
1911
1912=item stat EXPR
1913
1914=item stat
1915
1916Platforms that do not have rdev, blksize, or blocks will return these
1917as '', so numeric comparison or manipulation of these fields may cause
1918'not numeric' warnings.
1919
1920mtime and atime are the same thing, and ctime is creation time instead of
1921inode change time. (S<Mac OS>).
1922
1923ctime not supported on UFS (S<Mac OS X>).
1924
1925ctime is creation time instead of inode change time  (Win32).
1926
1927device and inode are not meaningful.  (Win32)
1928
1929device and inode are not necessarily reliable.  (VMS)
1930
1931mtime, atime and ctime all return the last modification time.  Device and
1932inode are not necessarily reliable.  (S<RISC OS>)
1933
1934dev, rdev, blksize, and blocks are not available.  inode is not
1935meaningful and will differ between stat calls on the same file.  (os2)
1936
1937some versions of cygwin when doing a stat("foo") and if not finding it
1938may then attempt to stat("foo.exe") (Cygwin)
1939
1940=item symlink OLDFILE,NEWFILE
1941
1942Not implemented. (Win32, VMS, S<RISC OS>)
1943
1944=item syscall LIST
1945
1946Not implemented. (S<Mac OS>, Win32, VMS, S<RISC OS>, VOS, VM/ESA)
1947
1948=item sysopen FILEHANDLE,FILENAME,MODE,PERMS
1949
1950The traditional "0", "1", and "2" MODEs are implemented with different
1951numeric values on some systems.  The flags exported by C<Fcntl>
1952(O_RDONLY, O_WRONLY, O_RDWR) should work everywhere though.  (S<Mac
1953OS>, OS/390, VM/ESA)
1954
1955=item system LIST
1956
1957In general, do not assume the UNIX/POSIX semantics that you can shift
1958C<$?> right by eight to get the exit value, or that C<$? & 127>
1959would give you the number of the signal that terminated the program,
1960or that C<$? & 128> would test true if the program was terminated by a
1961coredump.  Instead, use the POSIX W*() interfaces: for example, use
1962WIFEXITED($?) and WEXITVALUE($?) to test for a normal exit and the exit
1963value, WIFSIGNALED($?) and WTERMSIG($?) for a signal exit and the
1964signal.  Core dumping is not a portable concept, so there's no portable
1965way to test for that.
1966
1967Only implemented if ToolServer is installed. (S<Mac OS>)
1968
1969As an optimization, may not call the command shell specified in
1970C<$ENV{PERL5SHELL}>.  C<system(1, @args)> spawns an external
1971process and immediately returns its process designator, without
1972waiting for it to terminate.  Return value may be used subsequently
1973in C<wait> or C<waitpid>.  Failure to spawn() a subprocess is indicated
1974by setting $? to "255 << 8".  C<$?> is set in a way compatible with
1975Unix (i.e. the exitstatus of the subprocess is obtained by "$? >> 8",
1976as described in the documentation).  (Win32)
1977
1978There is no shell to process metacharacters, and the native standard is
1979to pass a command line terminated by "\n" "\r" or "\0" to the spawned
1980program.  Redirection such as C<< > foo >> is performed (if at all) by
1981the run time library of the spawned program.  C<system> I<list> will call
1982the Unix emulation library's C<exec> emulation, which attempts to provide
1983emulation of the stdin, stdout, stderr in force in the parent, providing
1984the child program uses a compatible version of the emulation library.
1985I<scalar> will call the native command line direct and no such emulation
1986of a child Unix program will exists.  Mileage B<will> vary.  (S<RISC OS>)
1987
1988Far from being POSIX compliant.  Because there may be no underlying
1989/bin/sh tries to work around the problem by forking and execing the
1990first token in its argument string.  Handles basic redirection
1991("<" or ">") on its own behalf. (MiNT)
1992
1993Does not automatically flush output handles on some platforms.
1994(SunOS, Solaris, HP-UX)
1995
1996The return value is POSIX-like (shifted up by 8 bits), which only allows
1997room for a made-up value derived from the severity bits of the native
199832-bit condition code (unless overridden by C<use vmsish 'status'>).
1999For more details see L<perlvms/$?>. (VMS)
2000
2001=item times
2002
2003Only the first entry returned is nonzero. (S<Mac OS>)
2004
2005"cumulative" times will be bogus.  On anything other than Windows NT
2006or Windows 2000, "system" time will be bogus, and "user" time is
2007actually the time returned by the clock() function in the C runtime
2008library. (Win32)
2009
2010Not useful. (S<RISC OS>)
2011
2012=item truncate FILEHANDLE,LENGTH
2013
2014=item truncate EXPR,LENGTH
2015
2016Not implemented. (Older versions of VMS)
2017
2018Truncation to zero-length only. (VOS)
2019
2020If a FILEHANDLE is supplied, it must be writable and opened in append
2021mode (i.e., use C<<< open(FH, '>>filename') >>>
2022or C<sysopen(FH,...,O_APPEND|O_RDWR)>.  If a filename is supplied, it
2023should not be held open elsewhere. (Win32)
2024
2025=item umask EXPR
2026
2027=item umask
2028
2029Returns undef where unavailable, as of version 5.005.
2030
2031C<umask> works but the correct permissions are set only when the file
2032is finally closed. (AmigaOS)
2033
2034=item utime LIST
2035
2036Only the modification time is updated. (S<BeOS>, S<Mac OS>, VMS, S<RISC OS>)
2037
2038May not behave as expected.  Behavior depends on the C runtime
2039library's implementation of utime(), and the filesystem being
2040used.  The FAT filesystem typically does not support an "access
2041time" field, and it may limit timestamps to a granularity of
2042two seconds. (Win32)
2043
2044=item wait
2045
2046=item waitpid PID,FLAGS
2047
2048Not implemented. (S<Mac OS>, VOS)
2049
2050Can only be applied to process handles returned for processes spawned
2051using C<system(1, ...)> or pseudo processes created with C<fork()>. (Win32)
2052
2053Not useful. (S<RISC OS>)
2054
2055=back
2056
2057=head1 CHANGES
2058
2059=over 4
2060
2061=item v1.48, 02 February 2001
2062
2063Various updates from perl5-porters over the past year, supported
2064platforms update from Jarkko Hietaniemi.
2065
2066=item v1.47, 22 March 2000
2067
2068Various cleanups from Tom Christiansen, including migration of
2069long platform listings from L<perl>.
2070
2071=item v1.46, 12 February 2000
2072
2073Updates for VOS and MPE/iX. (Peter Prymmer)  Other small changes.
2074
2075=item v1.45, 20 December 1999
2076
2077Small changes from 5.005_63 distribution, more changes to EBCDIC info.
2078
2079=item v1.44, 19 July 1999
2080
2081A bunch of updates from Peter Prymmer for C<$^O> values,
2082endianness, File::Spec, VMS, BS2000, OS/400.
2083
2084=item v1.43, 24 May 1999
2085
2086Added a lot of cleaning up from Tom Christiansen.
2087
2088=item v1.42, 22 May 1999
2089
2090Added notes about tests, sprintf/printf, and epoch offsets.
2091
2092=item v1.41, 19 May 1999
2093
2094Lots more little changes to formatting and content.
2095
2096Added a bunch of C<$^O> and related values
2097for various platforms; fixed mail and web addresses, and added
2098and changed miscellaneous notes.  (Peter Prymmer)
2099
2100=item v1.40, 11 April 1999
2101
2102Miscellaneous changes.
2103
2104=item v1.39, 11 February 1999
2105
2106Changes from Jarkko and EMX URL fixes Michael Schwern.  Additional
2107note about newlines added.
2108
2109=item v1.38, 31 December 1998
2110
2111More changes from Jarkko.
2112
2113=item v1.37, 19 December 1998
2114
2115More minor changes.  Merge two separate version 1.35 documents.
2116
2117=item v1.36, 9 September 1998
2118
2119Updated for Stratus VOS.  Also known as version 1.35.
2120
2121=item v1.35, 13 August 1998
2122
2123Integrate more minor changes, plus addition of new sections under
2124L<"ISSUES">: L<"Numbers endianness and Width">,
2125L<"Character sets and character encoding">,
2126L<"Internationalisation">.
2127
2128=item v1.33, 06 August 1998
2129
2130Integrate more minor changes.
2131
2132=item v1.32, 05 August 1998
2133
2134Integrate more minor changes.
2135
2136=item v1.30, 03 August 1998
2137
2138Major update for RISC OS, other minor changes.
2139
2140=item v1.23, 10 July 1998
2141
2142First public release with perl5.005.
2143
2144=back
2145
2146=head1 Supported Platforms
2147
2148As of September 2003 (the Perl release 5.8.1), the following platforms
2149are able to build Perl from the standard source code distribution
2150available at http://www.cpan.org/src/index.html
2151
2152        AIX
2153        BeOS
2154        BSD/OS          (BSDi)
2155        Cygwin
2156        DG/UX
2157        DOS DJGPP       1)
2158        DYNIX/ptx
2159        EPOC R5
2160        FreeBSD
2161        HI-UXMPP        (Hitachi) (5.8.0 worked but we didn't know it)
2162        HP-UX
2163        IRIX
2164        Linux
2165        LynxOS
2166        Mac OS Classic
2167        Mac OS X        (Darwin)
2168        MPE/iX
2169        NetBSD
2170        NetWare
2171        NonStop-UX
2172        ReliantUNIX     (formerly SINIX)
2173        OpenBSD
2174        OpenVMS         (formerly VMS)
2175        Open UNIX       (Unixware) (since Perl 5.8.1/5.9.0)
2176        OS/2
2177        OS/400          (using the PASE) (since Perl 5.8.1/5.9.0)
2178        PowerUX
2179        POSIX-BC        (formerly BS2000)
2180        QNX
2181        Solaris
2182        SunOS 4
2183        SUPER-UX        (NEC)
2184        SVR4
2185        Tru64 UNIX      (formerly DEC OSF/1, Digital UNIX)
2186        UNICOS
2187        UNICOS/mk
2188        UTS
2189        VOS
2190        Win95/98/ME/2K/XP 2)
2191        WinCE
2192        z/OS            (formerly OS/390)
2193        VM/ESA
2194
2195        1) in DOS mode either the DOS or OS/2 ports can be used
2196        2) compilers: Borland, MinGW (GCC), VC6
2197
2198The following platforms worked with the previous releases (5.6 and
21995.7), but we did not manage either to fix or to test these in time
2200for the 5.8.1 release.  There is a very good chance that many of these
2201will work fine with the 5.8.1.
2202
2203        DomainOS
2204        Hurd
2205        MachTen
2206        PowerMAX
2207        SCO SV
2208        Unixware
2209        Windows 3.1
2210
2211Known to be broken for 5.8.0 and 5.8.1 (but 5.6.1 and 5.7.2 can be used):
2212
2213        AmigaOS
2214
2215The following platforms have been known to build Perl from source in
2216the past (5.005_03 and earlier), but we haven't been able to verify
2217their status for the current release, either because the
2218hardware/software platforms are rare or because we don't have an
2219active champion on these platforms--or both.  They used to work,
2220though, so go ahead and try compiling them, and let perlbug@perl.org
2221of any trouble.
2222
2223        3b1
2224        A/UX
2225        ConvexOS
2226        CX/UX
2227        DC/OSx
2228        DDE SMES
2229        DOS EMX
2230        Dynix
2231        EP/IX
2232        ESIX
2233        FPS
2234        GENIX
2235        Greenhills
2236        ISC
2237        MachTen 68k
2238        MiNT
2239        MPC
2240        NEWS-OS
2241        NextSTEP
2242        OpenSTEP
2243        Opus
2244        Plan 9
2245        RISC/os
2246        SCO ODT/OSR
2247        Stellar
2248        SVR2
2249        TI1500
2250        TitanOS
2251        Ultrix
2252        Unisys Dynix
2253
2254The following platforms have their own source code distributions and
2255binaries available via http://www.cpan.org/ports/
2256
2257                                Perl release
2258
2259        OS/400 (ILE)            5.005_02
2260        Tandem Guardian         5.004
2261
2262The following platforms have only binaries available via
2263http://www.cpan.org/ports/index.html :
2264
2265                                Perl release
2266
2267        Acorn RISCOS            5.005_02
2268        AOS                     5.002
2269        LynxOS                  5.004_02
2270
2271Although we do suggest that you always build your own Perl from
2272the source code, both for maximal configurability and for security,
2273in case you are in a hurry you can check
2274http://www.cpan.org/ports/index.html for binary distributions.
2275
2276=head1 SEE ALSO
2277
2278L<perlaix>, L<perlamiga>, L<perlapollo>, L<perlbeos>, L<perlbs2000>,
2279L<perlce>, L<perlcygwin>, L<perldgux>, L<perldos>, L<perlepoc>,
2280L<perlebcdic>, L<perlfreebsd>, L<perlhurd>, L<perlhpux>, L<perlirix>,
2281L<perlmachten>, L<perlmacos>, L<perlmacosx>, L<perlmint>, L<perlmpeix>,
2282L<perlnetware>, L<perlos2>, L<perlos390>, L<perlos400>,
2283L<perlplan9>, L<perlqnx>, L<perlsolaris>, L<perltru64>,
2284L<perlunicode>, L<perlvmesa>, L<perlvms>, L<perlvos>,
2285L<perlwin32>, and L<Win32>.
2286
2287=head1 AUTHORS / CONTRIBUTORS
2288
2289Abigail <abigail@foad.org>,
2290Charles Bailey <bailey@newman.upenn.edu>,
2291Graham Barr <gbarr@pobox.com>,
2292Tom Christiansen <tchrist@perl.com>,
2293Nicholas Clark <nick@ccl4.org>,
2294Thomas Dorner <Thomas.Dorner@start.de>,
2295Andy Dougherty <doughera@lafayette.edu>,
2296Dominic Dunlop <domo@computer.org>,
2297Neale Ferguson <neale@vma.tabnsw.com.au>,
2298David J. Fiander <davidf@mks.com>,
2299Paul Green <Paul_Green@stratus.com>,
2300M.J.T. Guy <mjtg@cam.ac.uk>,
2301Jarkko Hietaniemi <jhi@iki.fi>,
2302Luther Huffman <lutherh@stratcom.com>,
2303Nick Ing-Simmons <nick@ing-simmons.net>,
2304Andreas J. KE<ouml>nig <a.koenig@mind.de>,
2305Markus Laker <mlaker@contax.co.uk>,
2306Andrew M. Langmead <aml@world.std.com>,
2307Larry Moore <ljmoore@freespace.net>,
2308Paul Moore <Paul.Moore@uk.origin-it.com>,
2309Chris Nandor <pudge@pobox.com>,
2310Matthias Neeracher <neeracher@mac.com>,
2311Philip Newton <pne@cpan.org>,
2312Gary Ng <71564.1743@CompuServe.COM>,
2313Tom Phoenix <rootbeer@teleport.com>,
2314AndrE<eacute> Pirard <A.Pirard@ulg.ac.be>,
2315Peter Prymmer <pvhp@forte.com>,
2316Hugo van der Sanden <hv@crypt0.demon.co.uk>,
2317Gurusamy Sarathy <gsar@activestate.com>,
2318Paul J. Schinder <schinder@pobox.com>,
2319Michael G Schwern <schwern@pobox.com>,
2320Dan Sugalski <dan@sidhe.org>,
2321Nathan Torkington <gnat@frii.com>.
2322
Note: See TracBrowser for help on using the repository browser.