This is Info file perl.info, produced by Makeinfo version 1.68 from the
input file bigperl.texi.

   settitle perl


File: perl.info,  Node: perlvms,  Next: perlwin32,  Prev: perlos390,  Up: Top

VMS-specific documentation for Perl
***********************************

NAME
====

   perlvms - VMS-specific documentation for Perl

DESCRIPTION
===========

   Gathered below are notes describing details of Perl 5's behavior on
VMS.  They are a supplement to the regular Perl 5 documentation, so we
have focussed on the ways in which Perl 5 functions differently under VMS
than it does under Unix, and on the interactions between Perl and the rest
of the operating system.  We haven't tried to duplicate complete
descriptions of Perl features from the main Perl documentation, which can
be found in the `[.pod]' subdirectory of the Perl distribution.

   We hope these notes will save you from confusion and lost sleep when
writing Perl scripts on VMS.  If you find we've missed something you think
should appear here, please don't hesitate to drop a line to
vmsperl@newman.upenn.edu.

Installation
============

   Directions for building and installing Perl 5 can be found in the file
`README.vms' in the main source directory of the Perl distribution..

Organization of Perl Images
===========================

Core Images
-----------

   During the installation process, three Perl images are produced.
`Miniperl.Exe' is an executable image which contains all of the basic
functionality of Perl, but cannot take advantage of Perl extensions.  It
is used to generate several files needed to build the complete Perl and
various extensions.  Once you've finished installing Perl, you can delete
this image.

   Most of the complete Perl resides in the shareable image `PerlShr.Exe',
which provides a core to which the Perl executable image and all Perl
extensions are linked.  You should place this image in `Sys$Share', or
define the logical name `PerlShr' to translate to the full file
specification of this image.  It should be world readable.  (Remember that
if a user has execute only access to `PerlShr', VMS will treat it as if it
were a privileged shareable image, and will therefore require all
downstream shareable images to be INSTALLed, etc.)

   Finally, `Perl.Exe' is an executable image containing the main entry
point for Perl, as well as some initialization code.  It should be placed
in a public directory, and made world executable.  In order to run Perl
with command line arguments, you should define a foreign command to invoke
this image.

Perl Extensions
---------------

   Perl extensions are packages which provide both XS and Perl code to add
new functionality to perl.  (XS is a meta-language which simplifies
writing C code which interacts with Perl, see *Note Perlxs: perlxs, for
more details.)  The Perl code for an extension is treated like any other
library module - it's made available in your script through the appropriate
use or require statement, and usually defines a Perl package containing
the extension.

   The portion of the extension provided by the XS code may be connected
to the rest of Perl in either of two ways.  In the static configuration,
the object code for the extension is linked directly into `PerlShr.Exe',
and is initialized whenever Perl is invoked.  In the dynamic
configuration, the extension's machine code is placed into a separate
shareable image, which is mapped by Perl's DynaLoader when the extension
is used or required in your script.  This allows you to maintain the
extension as a separate entity, at the cost of keeping track of the
additional shareable image.  Most extensions can be set up as either
static or dynamic.

   The source code for an extension usually resides in its own directory.
At least three files are generally provided: *Extshortname*`.xs' (where
*Extshortname* is the portion of the extension's name following the last
`::'), containing the XS code, *Extshortname*`.pm', the Perl library module
for the extension, and Makefile.PL, a Perl script which uses the MakeMaker
library modules supplied with Perl to generate a `Descrip.MMS' file for
the extension.

Installing static extensions
----------------------------

   Since static extensions are incorporated directly into `PerlShr.Exe',
you'll have to rebuild Perl to incorporate a new extension.  You should
edit the main `Descrip.MMS' or `Makefile' you use to build Perl, adding
the extension's name to the ext macro, and the extension's object file to
the `extobj' macro.  You'll also need to build the extension's object
file, either by adding dependencies to the main `Descrip.MMS', or using a
separate `Descrip.MMS' for the extension.  Then, rebuild `PerlShr.Exe' to
incorporate the new code.

   Finally, you'll need to copy the extension's Perl library module to the
`[.'*Extname*] subdirectory under one of the directories in `@INC', where
*Extname* is the name of the extension, with all `::' replaced by . (e.g.
the library module for extension Foo::Bar would be copied to a
`[.Foo.Bar]' subdirectory).

Installing dynamic extensions
-----------------------------

   In general, the distributed kit for a Perl extension includes a file
named Makefile.PL, which is a Perl program which is used to create a
`Descrip.MMS' file which can be used to build and install the files
required by the extension.  The kit should be unpacked into a directory
tree not under the main Perl source directory, and the procedure for
building the extension is simply

     $ perl Makefile.PL  ! Create Descrip.MMS
     $ mmk               ! Build necessary files
     $ mmk test          ! Run test code, if supplied
     $ mmk install       ! Install into public Perl tree

   *N.B.* The procedure by which extensions are built and tested creates
several levels (at least 4) under the directory in which the extension's
source files live.  For this reason, you shouldn't nest the source
directory too deeply in your directory structure, lest you eccedd RMS'
maximum of 8 levels of subdirectory in a filespec.  (You can use rooted
logical names to get another 8 levels of nesting, if you can't place the
files near the top of the physical directory structure.)

   VMS support for this process in the current release of Perl is
sufficient to handle most extensions.  However, it does not yet recognize
extra libraries required to build shareable images which are part of an
extension, so these must be added to the linker options file for the
extension by hand.  For instance, if the `PGPLOT' extension to Perl
requires the `PGPLOTSHR.EXE' shareable image in order to properly link the
Perl extension, then the line `PGPLOTSHR/Share' must be added to the
linker options file `PGPLOT.Opt' produced during the build process for the
Perl extension.

   By default, the shareable image for an extension is placed
`[.lib.site_perl.auto'*Arch*.*Extname*] directory of the installed Perl
directory tree (where *Arch* is `VMS_VAX' or `VMS_AXP', and *Extname* is
the name of the extension, with each `::' translated to .).  (See the
MakeMaker documentation for more details on installation options for
extensions.)  However, it can be manually placed in any of several
locations:    - the `[.Lib.Auto.'*Arch**$PVers**Extname*] subdirectory
of one of the directories in `@INC' (where *PVers*      is the version of
Perl you're using, as supplied in $],      with '.' converted to '_'), or
 - one of the directories in `@INC', or    - a directory which the
extensions Perl library module      passes to the DynaLoader when asking
it to map      the shareable image, or    - `Sys$Share' or `Sys$Library'.
If the shareable image isn't in any of these places, you'll need to define
a logical name *Extshortname*, where *Extshortname* is the portion of the
extension's name after the last `::', which translates to the full file
specification of the shareable image.

File specifications
===================

Syntax
------

   We have tried to make Perl aware of both VMS-style and Unix- style file
specifications wherever possible.  You may use either style, or both, on
the command line and in scripts, but you may not combine the two styles
within a single fle specification.  VMS Perl interprets Unix pathnames in
much the same way as the CRTL (*e.g.* the first component of an absolute
path is read as the device name for the VMS file specification).  There
are a set of functions provided in the `VMS::Filespec' package for explicit
interconversion between VMS and Unix syntax; its documentation provides
more details.

   Filenames are, of course, still case-insensitive.  For consistency,
most Perl routines return  filespecs using lower case letters only,
regardless of the case used in the arguments passed to them.  (This is
true  only when running under VMS; Perl respects the case-sensitivity of
OSs like Unix.)

   We've tried to minimize the dependence of Perl library modules on Unix
syntax, but you may find that some of these, as well as some scripts
written for Unix systems, will require that you use Unix syntax, since
they will assume that '/' is the directory separator, etc.  If you find
instances of this in the Perl distribution itself, please let us know, so
we can try to work around them.

Wildcard expansion
------------------

   File specifications containing wildcards are allowed both on the
command line and within Perl globs (e.g. <C<*.c>>).  If the wildcard
filespec uses VMS syntax, the resultant filespecs will follow VMS syntax;
if a Unix-style filespec is passed in, Unix-style filespecs will be
returned.

   In both cases, VMS wildcard expansion is performed. (csh-style wildcard
expansion is available if you use `File::Glob::glob'.)  If the wildcard
filespec contains a device or directory specification, then the resultant
filespecs will also contain a device and directory; otherwise, device and
directory information are removed.  VMS-style resultant filespecs will
contain a full device and directory, while Unix-style resultant filespecs
will contain only as much of a directory path as was present in the input
filespec.  For example, if your default directory is Perl_Root:[000000],
the expansion of `[.t]*.*' will yield filespecs  like
"perl_root:[t]base.dir", while the expansion of `t/*/*' will yield
filespecs like "t/base.dir".  (This is done to match the behavior of glob
expansion performed by Unix shells.)

   Similarly, the resultant filespec will contain the file version only if
one was present in the input filespec.

Pipes
-----

   Input and output pipes to Perl filehandles are supported; the "file
name" is passed to lib$spawn() for asynchronous execution.  You should be
careful to close any pipes you have opened in a Perl script, lest you
leave any "orphaned" subprocesses around when Perl exits.

   You may also use backticks to invoke a DCL subprocess, whose output is
used as the return value of the expression.  The string between the
backticks is handled as if it were the argument to the system operator
(see below).  In this case, Perl will wait for the subprocess to complete
before continuing.

PERL5LIB and PERLLIB
====================

   The PERL5LIB and PERLLIB logical names work as documented *Note Perl:
perl,, except that the element separator is '|' instead of ':'.  The
directory specifications may use either VMS or Unix syntax.

Command line
============

I/O redirection and backgrounding
---------------------------------

   Perl for VMS supports redirection of input and output on the command
line, using a subset of Bourne shell syntax:

     <F<file> reads stdin from F<file>,
     >F<file> writes stdout to F<file>,
     >>F<file> appends stdout to F<file>,
     2>F<file> writes stderr to F<file>, and
     2>>F<file> appends stderr to F<file>.

   In addition, output may be piped to a subprocess, using the character
'|'.  Anything after this character on the command line is passed to a
subprocess for execution; the subprocess takes the output of Perl as its
input.

   Finally, if the command line ends with '&', the entire command is run
in the background as an asynchronous subprocess.

Command line switches
---------------------

   The following command line switches behave differently under VMS than
described in *Note Perlrun: perlrun,.  Note also that in order to pass
uppercase switches to Perl, you need to enclose them in double-quotes on
the command line, since the CRTL downcases all unquoted strings.

-i
     If the -i switch is present but no extension for a backup copy is
     given, then inplace editing creates a new version of a file; the
     existing copy is not deleted.  (Note that if an extension is given,
     an existing file is renamed to the backup file, as is the case under
     other operating systems, so it does not remain as a previous version
     under the original filename.)

-S
     If the -S switch is present and the script name does not contain a
     directory, then Perl translates the logical name DCL$PATH as a
     searchlist, using each translation as a directory in which to look
     for the script.  In addition, if no file type is specified, Perl
     looks in each directory for a file matching the name specified, with
     a blank type, a type of `.pl', and a type of `.com', in that order.

-u
     The -u switch causes the VMS debugger to be invoked after the Perl
     program is compiled, but before it has run.  It does not create a
     core dump file.

Perl functions
==============

   As of the time this document was last revised, the following Perl
functions were implemented in the VMS port of Perl (functions marked with
* are discussed in more detail below):

     file tests*, abs, alarm, atan, backticks*, binmode*, bless,
     caller, chdir, chmod, chown, chomp, chop, chr,
     close, closedir, cos, crypt*, defined, delete,
     die, do, dump*, each, endpwent, eof, eval, exec*,
     exists, exit, exp, fileno, fork*, getc, getlogin,
     getpwent*, getpwnam*, getpwuid*, glob, gmtime*, goto,
     grep, hex, import, index, int, join, keys, kill*,
     last, lc, lcfirst, length, local, localtime, log, m//,
     map, mkdir, my, next, no, oct, open, opendir, ord, pack,
     pipe, pop, pos, print, printf, push, q//, qq//, qw//,
     qx//*, quotemeta, rand, read, readdir, redo, ref, rename,
     require, reset, return, reverse, rewinddir, rindex,
     rmdir, s///, scalar, seek, seekdir, select(internal),
     select (system call)*, setpwent, shift, sin, sleep,
     sort, splice, split, sprintf, sqrt, srand, stat,
     study, substr, sysread, system*, syswrite, tell,
     telldir, tie, time, times*, tr///, uc, ucfirst, umask,
     undef, unlink*, unpack, untie, unshift, use, utime*,
     values, vec, wait, waitpid*, wantarray, warn, write, y///

   The following functions were not implemented in the VMS port, and
calling them produces a fatal error (usually) or undefined behavior
(rarely, we hope):

     chroot, dbmclose, dbmopen, fcntl, flock,
     getpgrp, getppid, getpriority, getgrent, getgrgid,
     getgrnam, setgrent, endgrent, ioctl, link, lstat,
     msgctl, msgget, msgsend, msgrcv, readlink, semctl,
     semget, semop, setpgrp, setpriority, shmctl, shmget,
     shmread, shmwrite, socketpair, symlink, syscall

   The following functions are available on Perls compiled with Dec C 5.2
or greater and running VMS 7.0 or greater

     truncate

   The following functions may or may not be implemented, depending on
what type of socket support you've built into your copy of Perl:

     accept, bind, connect, getpeername,
     gethostbyname, getnetbyname, getprotobyname,
     getservbyname, gethostbyaddr, getnetbyaddr,
     getprotobynumber, getservbyport, gethostent,
     getnetent, getprotoent, getservent, sethostent,
     setnetent, setprotoent, setservent, endhostent,
     endnetent, endprotoent, endservent, getsockname,
     getsockopt, listen, recv, select(system call)*,
     send, setsockopt, shutdown, socket

File tests
     The tests -b, -B, -c, -C, -d, -e, -f, -o, -M, -s, -S, -t, -T, and -z
     work as advertised.  The return values for -r, -w, and -x tell you
     whether you can actually access the file; this may not reflect the
     UIC-based file protections.  Since real and effective UIC don't
     differ under VMS, -O, `-R', -W, and -X are equivalent to -o, -r, -w,
     and -x.  Similarly, several other tests, including -A, -g, -k, -l,
     -p, and -u, aren't particularly meaningful under VMS, and the values
     returned by these tests reflect whatever your CRTL stat() routine
     does to the equivalent bits in the st_mode field.  Finally, -d
     returns true if passed a device specification without an explicit
     directory (e.g. `DUA1:'), as well as if passed a directory.

     Note: Some sites have reported problems when using the file-access
     tests (-r, -w, and -x) on files accessed via DEC's DFS.
     Specifically, since DFS does not currently provide access to the
     extended file header of files on remote volumes, attempts to examine
     the ACL fail, and the file tests will return false, with $!
     indicating that the file does not exist.  You can use stat on these
     files, since that checks UIC-based protection only, and then manually
     check the appropriate bits, as defined by your C compiler's `stat.h',
     in the mode value it returns, if you need an approximation of the
     file's protections.

backticks
     Backticks create a subprocess, and pass the enclosed string to it for
     execution as a DCL command.  Since the subprocess is created directly
     via `lib$spawn()', any valid DCL command string may be specified.

binmode FILEHANDLE
     The binmode operator will attempt to insure that no translation of
     carriage control occurs on input from or output to this filehandle.
     Since this involves reopening the file and then restoring its file
     position indicator, if this function returns FALSE, the underlying
     filehandle may no longer point to an open file, or may point to a
     different position in the file than before binmode was called.

     Note that binmode is generally not necessary when using normal
     filehandles; it is provided so that you can control I/O to existing
     record-structured files when necessary.  You can also use the
     `vmsfopen' function in the VMS::Stdio extension to gain finer control
     of I/O to files and devices with different record structures.

crypt PLAINTEXT, USER
     The crypt operator uses the `sys$hash_password' system service to
     generate the hashed representation of PLAINTEXT.  If USER is a valid
     username, the algorithm and salt values are taken from that user's
     UAF record.  If it is not, then the preferred algorithm and a salt of
     0 are used.  The quadword encrypted value is returned as an
     8-character string.

     The value returned by crypt may be compared against the encrypted
     password from the UAF returned by the `getpw*' functions, in order to
     authenticate users.  If you're going to do this, remember that the
     encrypted password in the UAF was generated using uppercase username
     and password strings; you'll have to upcase the arguments to crypt to
     insure that you'll get the proper value:

          sub validate_passwd {
            my($user,$passwd) = @_;
            my($pwdhash);
            if ( !($pwdhash = (getpwnam($user))[1]) ||
                 $pwdhash ne crypt("\U$passwd","\U$name") ) {
              intruder_alert($name);
            }
            return 1;
          }

dump
     Rather than causing Perl to abort and dump core, the dump operator
     invokes the VMS debugger.  If you continue to execute the Perl
     program under the debugger, control will be transferred to the label
     specified as the argument to dump, or, if no label was specified,
     back to the beginning of the program.  All other state of the program
     (*e.g.* values of variables, open file handles) are not affected by
     calling dump.

exec LIST
     The exec operator behaves in one of two different ways.  If called
     after a call to fork, it will invoke the CRTL `execv()' routine,
     passing its arguments to the subprocess created by fork for
     execution.  In this case, it is subject to all limitations that
     affect `execv()'.  (In particular, this usually means that the
     command executed in the subprocess must be an image compiled from C
     source code, and that your options for passing file descriptors and
     signal handlers to the subprocess are limited.)

     If the call to exec does not follow a call to fork, it will cause
     Perl to exit, and to invoke the command given as an argument to exec
     via `lib$do_command'.  If the argument begins with '@' or '$' (other
     than as part of a filespec), then it is executed as a DCL command.
     Otherwise, the first token on the command line is treated as the
     filespec of an image to run, and an attempt is made to invoke it
     (using `.Exe' and the process defaults to expand the filespec) and
     pass the rest of exec's argument to it as parameters.  If the token
     has no file type, and matches a file with null type, then an attempt
     is made to determine whether the file is an executable image which
     should be invoked using `MCR' or a text file which should be passed
     to DCL as a command procedure.

     You can use exec in both ways within the same script, as long as you
     call fork and exec in pairs.  Perl keeps track of how many times fork
     and exec have been called, and will call the CRTL `execv()' routine
     if there have previously been more calls to fork than to exec.

fork
     The fork operator works in the same way as the CRTL `vfork()'
     routine, which is quite different under VMS than under Unix.
     Specifically, while fork returns 0 after it is called and the
     subprocess PID after exec is called, in both cases the thread of
     execution is within the parent process, so there is no opportunity to
     perform operations in the subprocess before calling exec.

     In general, the use of fork and exec to create subprocess is not
     recommended under VMS; wherever possible, use the system operator or
     piped filehandles instead.

getpwent
getpwnam
getpwuid
     These operators obtain the information described in *Note Perlfunc:
     perlfunc,, if you have the privileges necessary to retrieve the named
     user's UAF information via `sys$getuai'.  If not, then only the $name,
     `$uid', and `$gid' items are returned.  The $dir item contains the
     login directory in VMS syntax, while the $comment item contains the
     login directory in Unix syntax. The `$gcos' item contains the owner
     field from the UAF record.  The `$quota' item is not used.

gmtime
     The gmtime operator will function properly if you have a working CRTL
     `gmtime()' routine, or if the logical name SYS$TIMEZONE_DIFFERENTIAL
     is defined as the number of seconds which must be added to UTC to
     yield local time.  (This logical name is defined automatically if you
     are running a version of VMS with built-in UTC support.)  If neither
     of these cases is true, a warning message is printed, and undef is
     returned.

kill
     In most cases, kill kill is implemented via the CRTL's kill()
     function, so it will behave according to that function's
     documentation.  If you send a SIGKILL, however, the $DELPRC system
     service is called directly.  This insures that the target process is
     actually deleted, if at all possible.  (The CRTL's kill() function is
     presently implemented via $FORCEX, which is ignored by
     supervisor-mode images like DCL.)

     Also, negative signal values don't do anything special under VMS;
     they're just converted to the corresponding positive value.

qx//
     See the entry on backticks above.

select (system call)
     If Perl was not built with socket support, the system call version of
     select is not available at all.  If socket support is present, then
     the system call version of select functions only for file descriptors
     attached to sockets.  It will not provide information about regular
     files or pipes, since the CRTL select() routine does not provide this
     functionality.

stat EXPR
     Since VMS keeps track of files according to a different scheme than
     Unix, it's not really possible to represent the file's ID in the
     `st_dev' and `st_ino' fields of a `struct stat'.  Perl tries its
     best, though, and the values it uses are pretty unlikely to be the
     same for two different files.  We can't guarantee this, though, so
     caveat scriptor.

system LIST
     The system operator creates a subprocess, and passes its arguments to
     the subprocess for execution as a DCL command.  Since the subprocess
     is created directly via `lib$spawn()', any valid DCL command string
     may be specified.  If the string begins with '@', it is treated as a
     DCL command unconditionally.  Otherwise, if the first token contains
     a character used as a delimiter in file specification (e.g. : or ]),
     an attempt is made to expand it using  a default type of `.Exe' and
     the process defaults, and if successful, the resulting file is
     invoked via `MCR'. This allows you to invoke an image directly simply
     by passing the file specification to system, a common Unixish idiom.
     If the token has no file type, and matches a file with null type,
     then an attempt is made to determine whether the file is an
     executable image which should be invoked using `MCR' or a text file
     which should be passed to DCL as a command procedure.

     If LIST consists of the empty string, system spawns an interactive
     DCL subprocess, in the same fashion as typiing *SPAWN* at the DCL
     prompt.

     Perl waits for the subprocess to complete before continuing execution
     in the current process.  As described in *Note Perlfunc: perlfunc,,
     the return value of system is a fake "status" which follows POSIX
     semantics; see the description of $? in this document for more
     detail.  The actual VMS exit status of the subprocess is available in
     $^S (as long as you haven't used another Perl function that resets $?
     and $^S in the meantime).

time
     The value returned by time is the offset in seconds from 01-JAN-1970
     00:00:00 (just like the CRTL's times() routine), in order to make
     life easier for code coming in from the POSIX/Unix world.

times
     The array returned by the times operator is divided up according to
     the same rules the CRTL `times()' routine.  Therefore, the "system
     time" elements will always be 0, since there is no difference between
     "user time" and "system" time under VMS, and the time accumulated by
     subprocess may or may not appear separately in the "child time"
     field, depending on whether `times' in this node keeps track of
     subprocesses separately.  Note especially that the VAXCRTL (at least)
     keeps track only of subprocesses spawned using `fork' in this node
     and `exec' in this node; it will not accumulate the times of
     suprocesses spawned via pipes, `system' in this node, or backticks.

unlink LIST
     unlink will delete the highest version of a file only; in order to
     delete all versions, you need to say     1 while (unlink LIST); You
     may need to make this change to scripts written for a Unix system
     which expect that after a call to unlink, no files with the names
     passed to unlink will exist.  (Note: This can be changed at compile
     time; if you `use Config' and `$Config{'d_unlink_all_versions'}' is
     define, then unlink will delete all versions of a file on the first
     call.)

     unlink will delete a file if at all possible, even if it requires
     changing file protection (though it won't try to change the
     protection of the parent directory).  You can tell whether you've got
     explicit delete access to a file by using the
     `VMS::Filespec::candelete' operator.  For instance, in order to
     delete only files to which you have delete access, you could say
     something like

          sub safe_unlink {
              my($file,$num);
              foreach $file (@_) {
                  next unless VMS::Filespec::candelete($file);
                  $num += unlink $file;
              }
              $num;
          }

     (or you could just use `VMS::Stdio::remove', if you've installed the
     VMS::Stdio extension distributed with Perl). If unlink has to change
     the file protection to delete the file, and you interrupt it in
     midstream, the file may be left intact, but with a changed ACL
     allowing you delete access.

utime LIST
     Since ODS-2, the VMS file structure for disk files, does not keep
     track of access times, this operator changes only the modification
     time of the file (VMS revision date).

waitpid PID,FLAGS
     If PID is a subprocess started by a piped *Note Open: (pm.info)open,,
     waitpid will wait for that subprocess, and return its final status
     value.  If PID is a subprocess created in some other way (e.g.
     SPAWNed before Perl was invoked), or is not a subprocess of the
     current process, waitpid will check once per second whether the
     process has completed, and when it has, will return 0.  (If PID
     specifies a process that isn't a subprocess of the current process,
     and you invoked Perl with the -w switch, a warning will be issued.)

     The FLAGS argument is ignored in all cases.

Perl variables
==============

   The following VMS-specific information applies to the indicated
"special" Perl variables, in addition to the general information in *Note
Perlvar: perlvar,.  Where there is a conflict, this infrmation takes
precedence.

%ENV
     The operation of the %ENV array depends on the translation of the
     logical name `PERL_ENV_TABLES'.  If defined, it should be a search
     list, each element of which specifies a location for %ENV elements.
     If you tell Perl to read or set the element `$ENV{'name`}', then Perl
     uses the translations of `PERL_ENV_TABLES' as follows:

    CRTL_ENV
          This string tells Perl to consult the CRTL's internal `environ'
          array of key-value pairs, using name as the key.  In most cases,
          this contains only a few keys, but if Perl was invoked via the C
          `exec[lv]e()' function, as is the case for CGI processing by some
          HTTP servers, then the `environ' array may have been populated by
          the calling program.

    CLISYM_[LOCAL]
          A string beginning with `CLISYM_'tells Perl to consult the CLI's
          symbol tables, using name as the name of the symbol.  When
          reading an element of %ENV, the local symbol table is scanned
          first, followed by the global symbol table..  The characters
          following `CLISYM_' are significant when an element of %ENV is
          set or deleted: if the complete string is `CLISYM_LOCAL', the
          change is made in the local symbol table, otherwise the global
          symbol table is changed.

    Any other string
          If an element of `PERL_ENV_TABLES' translates to any other
          string, that string is used as the name of a logical name table,
          which is consulted using name as the logical name.  The normal
          search order of access modes is used.

     `PERL_ENV_TABLES' is translated once when Perl starts up; any changes
     you make while Perl is running do not affect the behavior of %ENV.
     If `PERL_ENV_TABLES' is not defined, then Perl defaults to consulting
     first the logical name tables specified by `LNM$FILE_DEV', and then
     the CRTL `environ' array.

     In all operations on %ENV, the key string is treated as if it were
     entirely uppercase, regardless of the case actually specified in the
     Perl expression.

     When an element of %ENV is read, the locations to which
     `PERL_ENV_TABLES' points are checked in order, and the value obtained
     from the first successful lookup is returned.  If the name of the
     %ENV element contains a semi-colon, it and any characters after it
     are removed.  These are ignored when the CRTL `environ' array or a
     CLI symbol table is consulted.  However, the name is looked up in a
     logical name table, the suffix after the semi-colon is treated as the
     translation index to be used for the lookup.   This lets you look up
     successive values for search list logical names.  For instance, if
     you say

          $  Define STORY  once,upon,a,time,there,was
          $  perl -e "for ($i = 0; $i <= 6; $i++) " -
          _$ -e "{ print $ENV{'story;'.$i},' '}"

     Perl will print `ONCE UPON A TIME THERE WAS', assuming, of course,
     that `PERL_ENV_TABLES' is set up so that the logical name `story' is
     found, rather than a CLI symbol or CRTL `environ' element with the
     same name.

     When an element of %ENV is set to a defined string, the corresponding
     definition is made in the location to which the first translation of
     `PERL_ENV_TABLES' points.  If this causes a logical name to be
     created, it is defined in supervisor mode.  (The same is done if an
     existing logical name was defined in executive or kernel mode; an
     existing user or supervisor mode logical name is reset to the new
     value.)  If the value is an empty string, the logical name's
     translation is defined as a single NUL (ASCII 00) character, since a
     logical name cannot translate to a zero-length string.  (This
     restriction does not apply to CLI symbols or CRTL `environ' values;
     they are set to the empty string.)  An element of the CRTL `environ'
     array can be set only if your copy of Perl knows about the CRTL's
     `setenv()' function.  (This is present only in some versions of the
     DECCRTL; check `$Config{d_setenv}' to see whether your copy of Perl
     was built with a CRTL that has this function.)

     When an element of %ENV is set to undef, the element is looked up as
     if it were being read, and if it is found, it is deleted.  (An item
     "deleted" from the CRTL `environ' array is set to the empty string;
     this can only be done if your copy of Perl knows about the CRTL
     `setenv()' function.)  Using delete to remove an element from %ENV
     has a similar effect, but after the element is deleted, another
     attempt is made to look up the element, so an inner-mode logical name
     or a name in another location will replace the logical name just
     deleted.  In either case, only the first value found searching
     PERL_ENV_TABLES is altered.  It is not possible at present to define
     a search list logical name via %ENV.

     The element `$ENV{DEFAULT}' is special: when read, it returns Perl's
     current default device and directory, and when set, it resets them,
     regardless of the definition of `PERL_ENV_TABLES'.  It cannot be
     cleared or deleted; attempts to do so are silently ignored.

     Note that if you want to pass on any elements of the C-local environ
     array to a subprocess which isn't started by fork/exec, or isn't
     running a C program, you can "promote" them to logical names in the
     current process, which will then be inherited by all subprocesses, by
     saying

          foreach my $key (qw[C-local keys you want promoted]) {
             my $temp = $ENV{$key}; # read from C-local array
             $ENV{$key} = $temp;    # and define as logical name
          }

     (You can't just say `$ENV{$key} = $ENV{$key}', since the Perl
     optimizer is smart enough to elide the expression.)

     At present, the first time you iterate over %ENV using keys, or
     values,  you will incur a time penalty as all logical names are read,
     in order to fully populate %ENV.  Subsequent iterations will not
     reread logical names, so they won't be as slow, but they also won't
     reflect any changes to logical name tables caused by other programs.

     You do need to be careful with the logicals representing
     process-permanent files, such as `SYS$INPUT' and `SYS$OUTPUT'.  The
     translations for these logicals are prepended with a two-byte binary
     value (0x1B 0x00) that needs to be stripped off if you want to use
     it. (In previous versions of perl it wasn't possible to get the
     values of these logicals, as the null byte acted as an end-of-string
     marker)

$!
     The string value of $! is that returned by the CRTL's strerror()
     function, so it will include the VMS message for VMS-specific errors.
     The numeric value of $! is the value of errno, except if errno is
     EVMSERR, in which case $! contains the value of vaxc$errno.  Setting
     $!  always sets errno to the value specified.  If this value is
     EVMSERR, it also sets vaxc$errno to 4 (NONAME-F-NOMSG), so that the
     string value of $! won't reflect the VMS error message from before $!
     was set.

$^E
     This variable provides direct access to VMS status values in
     vaxc$errno, which are often more specific than the generic Unix-style
     error messages in $!.  Its numeric value is the value of vaxc$errno,
     and its string value is the corresponding VMS message string, as
     retrieved by sys$getmsg().  Setting $^E sets vaxc$errno to the value
     specified.

$?
     The "status value" returned in $? is synthesized from the actual exit
     status of the subprocess in a way that approximates POSIX wait(5)
     semantics, in order to allow Perl programs to portably test for
     successful completion of subprocesses.  The low order 8 bits of $?
     are always 0 under VMS, since the termination status of a process may
     or may not have been generated by an exception.  The next 8 bits are
     derived from severity portion of the subprocess' exit status: if the
     severity was success or informational, these bits are all 0;
     otherwise, they contain the severity value shifted left one bit.  As
     a result, $? will always be zero if the subprocess' exit status
     indicated successful completion, and non-zero if a warning or error
     occurred.  The actual VMS exit status may be found in $^S (q.v.).

$^S
     Under VMS, this is the 32-bit VMS status value returned by the last
     subprocess to complete.  Unlink $?, no manipulation is done to make
     this look like a POSIX wait(5) value, so it may be treated as a
     normal VMS status value.

$|
     Setting $| for an I/O stream causes data to be flushed all the way to
     disk on each write (*i.e.* not just to the underlying RMS buffers for
     a file).  In other words, it's equivalent to calling fflush() and
     fsync() from C.

Standard modules with VMS-specific differences
==============================================

SDBM_File
---------

   SDBM_File works properly on VMS. It has, however, one minor difference.
The database directory file created has a `.sdbm_dir' extension rather
than a `.dir' extension. `.dir' files are VMS filesystem directory files,
and using them for other purposes could cause unacceptable problems.

Revision date
=============

   This document was last updated on 26-Feb-2000, for Perl 5, patchlevel 6.

AUTHOR
======

   Charles Bailey  <bailey@cor.newman.upenn.edu> Dan Sugalski
<dan@sidhe.org>


File: perl.info,  Node: perlwin32,  Next: Tk,  Prev: perlvms,  Up: Top

Perl under Win32
****************

NAME
====

   perlwin32 - Perl under Win32

SYNOPSIS
========

   These are instructions for building Perl under Windows (9x, NT and
2000).

DESCRIPTION
===========

   Before you start, you should glance through the README file found in
the top-level directory where the Perl distribution was extracted.  Make
sure you read and understand the terms under which this software is being
distributed.

   Also make sure you read `BUGS AND CAVEATS' in this node below for the
known limitations of this port.

   The INSTALL file in the perl top-level has much information that is
only relevant to people building Perl on Unix-like systems.  In
particular, you can safely ignore any information that talks about
"Configure".

   You may also want to look at two other options for building a perl that
will work on Windows NT:  the README.cygwin and README.os2 files, which
each give a different set of rules to build a Perl that will work on Win32
platforms.  Those two methods will probably enable you to build a more
Unix-compatible perl, but you will also need to download and use various
other build-time and run-time support software described in those files.

   This set of instructions is meant to describe a so-called "native" port
of Perl to Win32 platforms.  The resulting Perl requires no additional
software to run (other than what came with your operating system).
Currently, this port is capable of using one of the following compilers:

     Borland C++		version 5.02 or later
     Microsoft Visual C++	version 4.2 or later
     Mingw32 with GCC		version 2.95.2 or better

   The last of these is a high quality freeware compiler.  Support for it
is still experimental.  (Older versions of GCC are known not to work.)

   This port currently supports MakeMaker (the set of modules that is used
to build extensions to perl).  Therefore, you should be able to build and
install most extensions found in the CPAN sites.  See `Usage Hints' in
this node below for general hints about this.

Setting Up
----------

Make
     You need a "make" program to build the sources.  If you are using
     Visual C++ under Windows NT or 2000, nmake will work.  All other
     builds need dmake.

     dmake is a freely available make that has very nice macro features
     and parallelability.

     A port of dmake for Windows is available from:

          http://www.cpan.org/authors/id/GSAR/dmake-4.1pl1-win32.zip

     (This is a fixed version of original dmake sources obtained from
     http://www.wticorp.com/dmake/.  As of version 4.1PL1, the original
     sources did not build as shipped, and had various other problems.  A
     patch is included in the above fixed version.)

     Fetch and install dmake somewhere on your path (follow the
     instructions in the README.NOW file).

Command Shell
     Use the default "cmd" shell that comes with NT.  Some versions of the
     popular 4DOS/NT shell have incompatibilities that may cause you
     trouble.  If the build fails under that shell, try building again
     with the cmd shell.

     The nmake Makefile also has known incompatibilites with the
     "command.com" shell that comes with Windows 9x.  You will need to use
     dmake and makefile.mk to build under Windows 9x.

     The surest way to build it is on Windows NT, using the cmd shell.

     Make sure the path to the build directory does not contain spaces.
     The build usually works in this circumstance, but some tests will
     fail.

Borland C++
     If you are using the Borland compiler, you will need dmake.  (The
     make that Borland supplies is seriously crippled, and will not work
     for MakeMaker builds.)

     See L/"Make"> above.

Microsoft Visual C++
     The nmake that comes with Visual C++ will suffice for building.  You
     will need to run the VCVARS32.BAT file usually found somewhere like
     C:\MSDEV4.2\BIN.  This will set your build environment.

     You can also use dmake to build using Visual C++, provided: you set
     OSRELEASE to "microsft" (or whatever the directory name under which
     the Visual C dmake configuration lives) in your environment, and edit
     win32/config.vc to change "make=nmake" into "make=dmake".  The latter
     step is only essential if you want to use dmake as your default make
     for building extensions using MakeMaker.

Mingw32 with GCC
     GCC-2.95.2 binaries can be downloaded from:

          ftp://ftp.xraylith.wisc.edu/pub/khan/gnu-win32/mingw32/

     The GCC-2.95.2 bundle comes with Mingw32 libraries and headers.

     Make sure you install the binaries that work with MSVCRT.DLL as
     indicated in the README for the GCC bundle.  You may need to set up a
     few environment variables (usually run from a batch file).

     You also need dmake.  See `' in this node above on how to get it.

Building
--------

   * Make sure you are in the "win32" subdirectory under the perl toplevel.
     This directory contains a "Makefile" that will work with versions of
     nmake that come with Visual C++, and a dmake "makefile.mk" that will
     work for all supported compilers.  The defaults in the dmake makefile
     are setup to build using the GCC compiler.

   * Edit the makefile.mk (or Makefile, if using nmake) and change the
     values of INST_DRV and INST_TOP.   You can also enable various build
     flags.  These are explained in the makefiles.

     You will have to make sure CCTYPE is set correctly, and CCHOME points
     to wherever you installed your compiler.

     The default value for CCHOME in the makefiles for Visual C++ may not
     be correct for some versions.  Make sure the default exists and is
     valid.

     If you have either the source or a library that contains des_fcrypt(),
     enable the appropriate option in the makefile.  des_fcrypt() is not
     bundled with the distribution due to US Government restrictions on
     the export of cryptographic software.  Nevertheless, this routine is
     part of the "libdes" library (written by Eric Young) which is widely
     available worldwide, usually along with SSLeay (for example:
     "ftp://fractal.mta.ca/pub/crypto/SSLeay/DES/").  Set CRYPT_SRC to the
     name of the file that implements des_fcrypt().  Alternatively, if you
     have built a library that contains des_fcrypt(), you can set
     CRYPT_LIB to point to the library name.  The location above contains
     many versions of the "libdes" library, all with slightly different
     implementations of des_fcrypt().  Older versions have a single,
     self-contained file (fcrypt.c) that implements crypt(), so they may be
     easier to use.  A patch against the fcrypt.c found in libdes-3.06 is
     in des_fcrypt.patch.

     Perl will also build without des_fcrypt(), but the crypt() builtin
     will fail at run time.

     Be sure to read the instructions near the top of the makefiles
     carefully.

   * Type "dmake" (or "nmake" if you are using that make).

     This should build everything.  Specifically, it will create perl.exe,
     perl56.dll at the perl toplevel, and various other extension dll's
     under the lib\auto directory.  If the build fails for any reason, make
     sure you have done the previous steps correctly.

Testing
-------

   Type "dmake test" (or "nmake test").  This will run most of the tests
from the testsuite (many tests will be skipped).

   No tests should typically fail when running Windows NT 4.0.  Under
Windows 2000, test 22 in lib/open3.t is known to fail (cause still
unknown).  Many tests will fail under Windows 9x due to the inferior
command shell.

   Some test failures may occur if you use a command shell other than the
native "cmd.exe", or if you are building from a path that contains spaces.
So don't do that.

   If you are running the tests from a emacs shell window, you may see
failures in op/stat.t.  Run "dmake test-notty" in that case.

   If you're using the Borland compiler, you may see a failure in
op/taint.t arising from the inability to find the Borland Runtime DLLs on
the system default path.  You will need to copy the DLLs reported by the
messages from where Borland chose to install it, into the Windows system
directory (usually somewhere like C:\WINNT\SYSTEM32), and rerun the test.

   Please report any other failures as described under `BUGS AND CAVEATS'
in this node.

Installation
------------

   Type "dmake install" (or "nmake install").  This will put the newly
built perl and the libraries under whatever `INST_TOP' points to in the
Makefile.  It will also install the pod documentation under
`$INST_TOP\$VERSION\lib\pod' and HTML versions of the same under
`$INST_TOP\$VERSION\lib\pod\html'.  To use the Perl you just installed,
you will need to add two components to your PATH environment variable,
`$INST_TOP\$VERSION\bin', and `$INST_TOP\$VERSION\bin\$ARCHNAME'.  For
example:

     set PATH c:\perl\5.6.0\bin;c:\perl\5.6.0\bin\MSWin32-x86;%PATH%

   If you opt to comment out INST_VER and INST_ARCH in the makefiles, the
installation structure is much simpler.  In that case, it will be
sufficient to add a single entry to the path, for instance:

     set PATH c:\perl\bin;%PATH%

Usage Hints
-----------

Environment Variables
     The installation paths that you set during the build get compiled
     into perl, so you don't have to do anything additional to start using
     that perl (except add its location to your PATH variable).

     If you put extensions in unusual places, you can set PERL5LIB to a
     list of paths separated by semicolons where you want perl to look for
     libraries.  Look for descriptions of other environment variables you
     can set in *Note Perlrun: perlrun,.

     You can also control the shell that perl uses to run system() and
     backtick commands via PERL5SHELL.  See *Note Perlrun: perlrun,.

     Perl does not depend on the registry, but it can look up certain
     default values if you choose to put them there.  Perl attempts to
     read entries from `HKEY_CURRENT_USER\Software\Perl' and
     `HKEY_LOCAL_MACHINE\Software\Perl'.  Entries in the former override
     entries in the latter.  One or more of the following entries (of type
     REG_SZ or REG_EXPAND_SZ) may be set:

          lib-$]		version-specific standard library path to add to @INC
          lib			standard library path to add to @INC
          sitelib-$]		version-specific site library path to add to @INC
          sitelib		site library path to add to @INC
          vendorlib-$]	version-specific vendor library path to add to @INC
          vendorlib		vendor library path to add to @INC
          PERL*		fallback for all %ENV lookups that begin with "PERL"

     Note the $] in the above is not literal.  Substitute whatever version
     of perl you want to honor that entry, e.g. `5.6.0'.  Paths must be
     separated with semicolons, as usual on win32.

File Globbing
     By default, perl handles file globbing using the File::Glob extension,
     which provides portable globbing.

     If you want perl to use globbing that emulates the quirks of DOS
     filename conventions, you might want to consider using File::DosGlob
     to override the internal glob() implementation.  See *Note
     File/DosGlob: (pm.info)File/DosGlob, for details.

Using perl from the command line
     If you are accustomed to using perl from various command-line shells
     found in UNIX environments, you will be less than pleased with what
     Windows offers by way of a command shell.

     The crucial thing to understand about the "cmd" shell (which is the
     default on Windows NT) is that it does not do any wildcard expansions
     of command-line arguments (so wildcards need not be quoted).  It also
     provides only rudimentary quoting.  The only (useful) quote character
     is the double quote (").  It can be used to protect spaces in
     arguments and other special characters.  The Windows NT documentation
     has almost no description of how the quoting rules are implemented,
     but here are some general observations based on experiments:  The
     shell breaks arguments at spaces and passes them to programs in
     argc/argv.  Doublequotes can be used to prevent arguments with spaces
     in them from being split up.  You can put a double quote in an
     argument by escaping it with a backslash and enclosing the whole
     argument within double quotes.  The backslash and the pair of double
     quotes surrounding the argument will be stripped by the shell.

     The file redirection characters "<", ">", and "|" cannot be quoted by
     double quotes (there are probably more such).  Single quotes will
     protect those three file redirection characters, but the single
     quotes don't get stripped by the shell (just to make this type of
     quoting completely useless).  The caret "^" has also been observed to
     behave as a quoting character (and doesn't get stripped by the shell
     also).

     Here are some examples of usage of the "cmd" shell:

     This prints two doublequotes:

          perl -e "print '\"\"' "

     This does the same:

          perl -e "print \"\\\"\\\"\" "

     This prints "bar" and writes "foo" to the file "blurch":

          perl -e "print 'foo'; print STDERR 'bar'" > blurch

     This prints "foo" ("bar" disappears into nowhereland):

          perl -e "print 'foo'; print STDERR 'bar'" 2> nul

     This prints "bar" and writes "foo" into the file "blurch":

          perl -e "print 'foo'; print STDERR 'bar'" 1> blurch

     This pipes "foo" to the "less" pager and prints "bar" on the console:

          perl -e "print 'foo'; print STDERR 'bar'" | less

     This pipes "foo\nbar\n" to the less pager:

          perl -le "print 'foo'; print STDERR 'bar'" 2>&1 | less

     This pipes "foo" to the pager and writes "bar" in the file "blurch":

          perl -e "print 'foo'; print STDERR 'bar'" 2> blurch | less

     Discovering the usefulness of the "command.com" shell on Windows 9x
     is left as an exercise to the reader :)

Building Extensions
     The Comprehensive Perl Archive Network (CPAN) offers a wealth of
     extensions, some of which require a C compiler to build.  Look in
     http://www.cpan.org/ for more information on CPAN.

     Note that not all of the extensions available from CPAN may work in
     the Win32 environment; you should check the information at
     http://testers.cpan.org/ before investing too much effort into
     porting modules that don't readily build.

     Most extensions (whether they require a C compiler or not) can be
     built, tested and installed with the standard mantra:

          perl Makefile.PL
          $MAKE
          $MAKE test
          $MAKE install

     where $MAKE is whatever 'make' program you have configured perl to
     use.  Use "perl -V:make" to find out what this is.  Some extensions
     may not provide a testsuite (so "$MAKE test" may not do anything, or
     fail), but most serious ones do.

     It is important that you use a supported 'make' program, and ensure
     Config.pm knows about it.  If you don't have nmake, you can either
     get dmake from the location mentioned earlier, or get an old version
     of nmake reportedly available from:

          ftp://ftp.microsoft.com/Softlib/MSLFILES/nmake15.exe

     Another option is to use the make written in Perl, available from
     CPAN:

          http://www.cpan.org/authors/id/NI-S/Make-0.03.tar.gz

     You may also use dmake.  See `' in this node above on how to get it.

     Note that MakeMaker actually emits makefiles with different syntax
     depending on what 'make' it thinks you are using.  Therefore, it is
     important that one of the following values appears in Config.pm:

          make='nmake'	# MakeMaker emits nmake syntax
          make='dmake'	# MakeMaker emits dmake syntax
          any other value	# MakeMaker emits generic make syntax
          			    (e.g GNU make, or Perl make)

     If the value doesn't match the 'make' program you want to use, edit
     Config.pm to fix it.

     If a module implements XSUBs, you will need one of the supported C
     compilers.  You must make sure you have set up the environment for
     the compiler for command-line compilation.

     If a module does not build for some reason, look carefully for why it
     failed, and report problems to the module author.  If it looks like
     the extension building support is at fault, report that with full
     details of how the build failed using the perlbug utility.

Command-line Wildcard Expansion
     The default command shells on DOS descendant operating systems (such
     as they are) usually do not expand wildcard arguments supplied to
     programs.  They consider it the application's job to handle that.
     This is commonly achieved by linking the application (in our case,
     perl) with startup code that the C runtime libraries usually provide.
     However, doing that results in incompatible perl versions (since the
     behavior of the argv expansion code differs depending on the
     compiler, and it is even buggy on some compilers).  Besides, it may
     be a source of frustration if you use such a perl binary with an
     alternate shell that *does* expand wildcards.

     Instead, the following solution works rather well. The nice things
     about it: 1) you can start using it right away 2) it is more powerful,
     because it will do the right thing with a pattern like */*/*.c 3) you
     can decide whether you do/don't want to use it 4) you can extend the
     method to add any customizations (or even entirely different kinds of
     wildcard expansion).

          C:\> copy con c:\perl\lib\Wild.pm
          # Wild.pm - emulate shell @ARGV expansion on shells that don't
          use File::DosGlob;
          @ARGV = map {
          	      my @g = File::DosGlob::glob($_) if /[*?]/;
          	      @g ? @g : $_;
          	    } @ARGV;
          1;
          ^Z
          C:\> set PERL5OPT=-MWild
          C:\> perl -le "for (@ARGV) { print }" */*/perl*.c
          p4view/perl/perl.c
          p4view/perl/perlio.c
          p4view/perl/perly.c
          perl5.005/win32/perlglob.c
          perl5.005/win32/perllib.c
          perl5.005/win32/perlglob.c
          perl5.005/win32/perllib.c
          perl5.005/win32/perlglob.c
          perl5.005/win32/perllib.c

     Note there are two distinct steps there: 1) You'll have to create
     Wild.pm and put it in your perl lib directory. 2) You'll need to set
     the PERL5OPT environment variable.  If you want argv expansion to be
     the default, just set PERL5OPT in your default startup environment.

     If you are using the Visual C compiler, you can get the C runtime's
     command line wildcard expansion built into perl binary.  The resulting
     binary will always expand unquoted command lines, which may not be
     what you want if you use a shell that does that for you.  The
     expansion done is also somewhat less powerful than the approach
     suggested above.

Win32 Specific Extensions
     A number of extensions specific to the Win32 platform are available
     from CPAN.  You may find that many of these extensions are meant to
     be used under the Activeware port of Perl, which used to be the only
     native port for the Win32 platform.  Since the Activeware port does
     not have adequate support for Perl's extension building tools, these
     extensions typically do not support those tools either, and therefore
     cannot be built using the generic steps shown in the previous section.

     To ensure smooth transitioning of existing code that uses the
     ActiveState port, there is a bundle of Win32 extensions that contains
     all of the ActiveState extensions and most other Win32 extensions from
     CPAN in source form, along with many added bugfixes, and with
     MakeMaker support.  This bundle is available at:

          http://www.cpan.org/authors/id/GSAR/libwin32-0.151.zip

     See the README in that distribution for building and installation
     instructions.  Look for later versions that may be available at the
     same location.

Running Perl Scripts
     Perl scripts on UNIX use the "#!" (a.k.a "shebang") line to indicate
     to the OS that it should execute the file using perl.  Win32 has no
     comparable means to indicate arbitrary files are executables.

     Instead, all available methods to execute plain text files on Win32
     rely on the file "extension".  There are three methods to use this to
     execute perl scripts:

       1. There is a facility called "file extension associations" that
          will work in Windows NT 4.0.  This can be manipulated via the two
          commands "assoc" and "ftype" that come standard with Windows NT
          4.0.  Type "ftype /?" for a complete example of how to set this
          up for perl scripts (Say what?  You thought Windows NT wasn't
          perl-ready? :).

       2. Since file associations don't work everywhere, and there are
          reportedly bugs with file associations where it does work, the
          old method of wrapping the perl script to make it look like a
          regular batch file to the OS, may be used.  The install process
          makes available the "pl2bat.bat" script which can be used to wrap
          perl scripts into batch files.  For example:

               pl2bat foo.pl

          will create the file "FOO.BAT".  Note "pl2bat" strips any .pl
          suffix and adds a .bat suffix to the generated file.

          If you use the 4DOS/NT or similar command shell, note that
          "pl2bat" uses the "%*" variable in the generated batch file to
          refer to all the command line arguments, so you may need to make
          sure that construct works in batch files.  As of this writing,
          4DOS/NT users will need a "ParameterChar = *" statement in their
          4NT.INI file, or will need to execute "setdos /p*" in the 4DOS/NT
          startup file to enable this to work.

       3. Using "pl2bat" has a few problems:  the file name gets changed,
          so scripts that rely on $0 to find what they must do may not run
          properly; running "pl2bat" replicates the contents of the
          original script, and so this process can be maintenance intensive
          if the originals get updated often.  A different approach that
          avoids both problems is possible.

          A script called "runperl.bat" is available that can be copied to
          any filename (along with the .bat suffix).  For example, if you
          call it "foo.bat", it will run the file "foo" when it is
          executed.  Since you can run batch files on Win32 platforms
          simply by typing the name (without the extension), this
          effectively runs the file "foo", when you type either "foo" or
          "foo.bat".  With this method, "foo.bat" can even be in a
          different location than the file "foo", as long as "foo" is
          available somewhere on the PATH.  If your scripts are on a
          filesystem that allows symbolic links, you can even avoid
          copying "runperl.bat".

          Here's a diversion:  copy "runperl.bat" to "runperl", and type
          "runperl".  Explain the observed behavior, or lack thereof. :)
          Hint: .gnidnats llits er'uoy fi ,"lrepnur" eteled :tniH


Miscellaneous Things
     A full set of HTML documentation is installed, so you should be able
     to use it if you have a web browser installed on your system.

     perldoc is also a useful tool for browsing information contained in
     the documentation, especially in conjunction with a pager like less
     (recent versions of which have Win32 support).  You may have to set
     the PAGER environment variable to use a specific pager.  "perldoc -f
     foo" will print information about the perl operator "foo".

     If you find bugs in perl, you can run `perlbug' to create a bug
     report (you may have to send it manually if `perlbug' cannot find a
     mailer on your system).

BUGS AND CAVEATS
================

   Some of the built-in functions do not act exactly as documented in
*Note Perlfunc: perlfunc,, and a few are not implemented at all.  To avoid
surprises, particularly if you have had prior exposure to Perl in other
operating environments or if you intend to write code that will be
portable to other environments, see *Note Perlport: perlport, for a
reasonably definitive list of these differences.

   Not all extensions available from CPAN may build or work properly in
the Win32 environment.  See `' in this node.

   Most `socket()' related calls are supported, but they may not behave as
on Unix platforms.  See *Note Perlport: perlport, for the full list.

   Signal handling may not behave as on Unix platforms (where it doesn't
exactly "behave", either :).  For instance, calling `die()' or exit() from
signal handlers will cause an exception, since most implementations of
`signal()' on Win32 are severely crippled.  Thus, signals may work only
for simple things like setting a flag variable in the handler.  Using
signals under this port should currently be considered unsupported.

   Please send detailed descriptions of any problems and solutions that
you may find to <`perlbug@perl.com'>, along with the output produced by
`perl -V'.

AUTHORS
=======

   Gary Ng <71564.1743@CompuServe.COM>

   Gurusamy Sarathy <gsar@activestate.com>

   Nick Ing-Simmons <nick@ni-s.u-net.com>

   This document is maintained by Gurusamy Sarathy.

SEE ALSO
========

   *Note Perl: perl,

HISTORY
=======

   This port was originally contributed by Gary Ng around 5.003_24, and
borrowed from the Hip Communications port that was available at the time.
Various people have made numerous and sundry hacks since then.

   Borland support was added in 5.004_01 (Gurusamy Sarathy).

   GCC/mingw32 support was added in 5.005 (Nick Ing-Simmons).

   Support for PERL_OBJECT was added in 5.005 (ActiveState Tool Corp).

   Support for fork() emulation was added in 5.6 (ActiveState Tool Corp).

   Win9x support was added in 5.6 (Benjamin Stuhl).

   Last updated: 22 March 2000


