home *** CD-ROM | disk | FTP | other *** search
- =head1 Notes on Perl 5 for VMS
-
- 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 F<[.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@genetics.upenn.edu.
-
- =head1 Organization of Perl
-
- =head2 Perl Images
-
- During the installation process, three Perl images are produced.
- F<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
- F<PerlShr.Exe>, which provides a core to which the Perl executable
- image and all Perl extensions are linked. You should place this
- image in F<Sys$Share>, or define the logical name F<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 F<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, F<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.
-
- =head2 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
- L<perlapi> 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
- C<use> or C<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
- B<static> configuration, the object code for the extension is
- linked directly into F<PerlShr.Exe>, and is initialized whenever
- Perl is invoked. In the B<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 C<use>d or
- C<require>d 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:
- I<Extshortname>F<.xs> (where I<Extshortname> is the portion of
- the extension's name following the last C<::>), containing
- the XS code, I<Extshortname>F<.pm>, the Perl library module
- for the extension, and F<Makefile.PL>, a Perl script which uses
- the C<MakeMaker> library modules supplied with Perl to generate
- a F<Descrip.MMS> file for the extension.
-
- =head3 Installing static extensions
-
- Since static extensions are incorporated directly into
- F<PerlShr.Exe>, you'll have to rebuild Perl to incorporate a
- new extension. You should edit the main F<Descrip.MMS> or F<Makefile>
- you use to build Perl, adding the extension's name to the C<ext>
- macro, and the extension's object file to the C<extobj> macro.
- You'll also need to build the extension's object file, either
- by adding dependencies to the main F<Descrip.MMS>, or using a
- separate F<Descrip.MMS> for the extension. Then, rebuild
- F<PerlShr.Exe> to incorporate the new code.
-
- Finally, you'll need to copy the extension's Perl library
- module to the F<[.>I<Extname>F<]> subdirectory under one
- of the directories in C<@INC>, where I<Extname> is the name
- of the extension, with all C<::> replaced by C<.> (e.g.
- the library module for extension Foo::Bar would be copied
- to a F<[.Foo.Bar]> subdirectory).
-
- =head3 Installic dynamic extensions
-
- First, you'll need to compile the XS code into a shareable image,
- either by hand or using the F<Descrip.MMS> supplied with the
- extension. If you're building the shareable image by hand, please
- note the following points:
- - The shareable image must be linked to F<PerlShr.Exe>, so it
- has access to Perl's global variables and routines. In
- order to specify the correct attributes for psects in
- F<PerlShr.Exe>, you should include the linker options file
- F<PerlShr_Attr.Opt> in the Link command. (This file is
- generated when F<PerlShr.Exe> is built, and is found in the
- main Perl source directory.
- - The entry point for the C<boot_>I<Extname> routine (where
- I<Extname> is the name of the extension, with all C<::>
- replaced by C<__>) must be a universal symbol. No other
- universal symbols are required to use the shareable image
- with Perl, though you may want to include additional
- universal symbols if you plan to share code or data among
- different extensions.
- The shareable image can be placed in any of several locations:
- - the F<[.Auto.>I<Extname>F<]> subdirectory of one of
- the directories in C<@INC>, where I<Extname> is the
- name of the extension, with each C<::> translated to C<.>
- (e.g. for extension Foo::Bar, you would use the
- F<[.Auto.Foo.Bar]> subdirectory), or
- - one of the directories in C<@INC>, or
- - a directory which the extensions Perl library module
- passes to the DynaLoader when asking it to map
- the shareable image, or
- - F<Sys$Share> or F<Sys$Library>.
- If the shareable image isn't in any of these places, you'll need
- to define a logical name I<Extshortname>, where I<Extshortname>
- is the portion of the extension's name after the last C<::>, which
- translates to the full file specification of the shareable image.
-
- Once you've got the shareable image set up, you should copy the
- extension's Perl library module to the appropriate library directory
- (see the section above on installing static extensions).
-
- =head1 Installation
-
- Directions for building and installing Perl 5 can be found in
- the file F<ReadMe.VMS> in the main source directory of the
- Perl distribution..
-
- =head1 File specifications
-
- 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
- specfication. Filenames are, of course, still case-
- insensitive. For consistency, most Perl routines return
- filespecs using lower case latters 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.
-
- =head1 Command line redirection
-
- 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.
-
- =head1 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 passed directly to lib$spawn
- as the command to execute. In this case, Perl will wait for
- the subprocess to complete before continuing.
-
- =head1 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..
-
- 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 C<[.t]*.*> will yield filespecs like
- "perl_root:[t]base.dir", while the expansion of C<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 the file version only
- if one was present in the input filespec.
-
- =head1 PERL5LIB and PERLLIB
-
- The PERL5LIB and PERLLIB logical names work as
- documented L<perl>, except that the element
- separator is '|' instead of ':'. The directory
- specifications may use either VMS or Unix syntax.
-
- =head1 %ENV
-
- Reading the elements of the %ENV array returns the
- translation of the logical name specified by the key,
- according to the normal search order of access modes and
- logical name tables. In addition, the keys C<home>,
- C<path>,C<term>, and C<user> return the CRTL "environment
- variables" of the same names. The key C<default> returns the
- current default device and directory specification.
-
- Setting an element of %ENV defines a supervisor-mode logical
- name in the process logical name table. C<Undef>ing or
- C<delete>ing an element of %ENV deletes the equivalent user-
- mode or supervisor-mode logical name from the process logical
- name table. If you use C<undef>, the %ENV element remains
- empty. If you use C<delete>, another attempt is made at
- logical name translation after the deletion, so an inner-mode
- logical name or a name in another logical name table will
- replace the logical name just deleted.
-
- 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.
-
- =head1 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, binmode*, bless,
- caller, chdir, chmod, chown, chomp, chop, chr,
- close, closedir, cos, defined, delete, die, do,
- each, endpwent, eof, eval, exec*, exists, exit,
- exp, fileno, fork*, getc, getpwent*, getpwnam*,
- getpwuid*, glob, 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)*,
- 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, crypt, dbmclose, dbmopen, dump, fcntl,
- flock, getlogin, getpgrp, getppid, getpriority,
- getgrent, kill, getgrgid, getgrnam, setgrent,
- endgrent, gmtime, ioctl, link, lstst, msgctl,
- msgget, msgsend, msgrcv, readlink,
- select(system call), semctl, semget, semop,
- setpgrp, setpriority, shmctl, shmget, shmread,
- shmwrite, socketpair, symlink, syscall, 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, send, setsockopt,
- shutdown, socket
-
-
- =item File tests
-
- The tests C<-b>, C<-B>, C<-c>, C<-C>, C<-d>, C<-e>, C<-f>,
- C<-o>, C<-M>, C<-s>, C<-S>, C<-t>, C<-T>, and C<-z> work as
- advertised. The return values for C<-r>, C<-w>, and C<-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, C<-O>, C<-R>, C<-W>,
- and C<-X> are equivalent to C<-o>, C<-r>, C<-w>, and C<-x>.
- Similarly, several other tests, including C<-A>, C<-g>, C<-k>,
- C<-l>, C<-p>, and C<-u>, aren't particularly meaningful under
- VMS, and the values returned by these tests reflect whatever
- your CRTL C<stat()> routine does to the equivalent bits in the
- st_mode field. Finally, C<-d> returns true if passed a device
- specification without an explicit directory (e.g. C<DUA1:>), as
- well as if passed a directory.
-
- =item binmode FILEHANDLE
-
- The C<binmode> operator has no effect under VMS. It will
- return TRUE whenever called, but will not affect I/O
- operations on the filehandle given as its argument.
-
- =item exec LIST
-
- The C<exec> operator behaves in one of two different ways.
- If called after a call to C<fork>, it will invoke the CRTL
- C<execv()> routine, passing its arguments to the subprocess
- created by C<fork> for execution. In this case, it is
- subject to all limitations that affect C<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 C<exec> does not follow a call to C<fork>, it
- will cause Perl to exit, and to invoke the command given as
- an argument to C<exec> via C<lib$do_command>. If the argument
- begins with a '$' (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 F<.Exe> and
- the process defaults to expand the filespec) and pass the
- rest of C<exec>'s argument to it as parameters.
-
- You can use C<exec> in both ways within the same script, as
- long as you call C<fork> and C<exec> in pairs. Perl
- keeps track of how many times C<fork> and C<exec> have been
- called, and will call the CRTL C<execv()> routine if there have
- previously been more calls to C<fork> than to C<exec>.
-
- =item fork
-
- The C<fork> operator works in the same way as the CRTL
- C<vfork()> routine, which is quite different under VMS than
- under Unix. Specifically, while C<fork> returns 0 after it
- is called and the subprocess PID after C<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 C<exec>.
-
- In general, the use of C<fork> and C<exec> to create
- subprocess is not recommended under VMS; wherever possible,
- use the C<system> operator or piped filehandles instead.
-
- =item getpwent
- =item getpwnam
- =item getpwuid
-
- These operators obtain the information described in L<perlfunc>,
- if you have the privileges necessary to retrieve the named user's
- UAF information via C<sys$getuai>. If not, then only the C<$name>,
- C<$uid>, and C<$gid> items are returned. The C<$dir> item contains
- the login directory in VMS syntax, while the C<$comment> item
- contains the login directory in Unix syntax. The C<$gcos> item
- contains the owner field from the UAF record. The C<$quota>
- item is not used.
-
- =item 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 C<st_dev> and C<st_ino> fields of a C<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.
-
- =item system LIST
-
- The C<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 LIST consists
- of the empty string, C<system> spawns an interactive DCL subprocess,
- in the same fashion as typiing B<SPAWN> at the DCL prompt.
- Perl waits for the subprocess to complete before continuing
- execution in the current process.
-
- =item times
-
- The array returned by the C<times> operator is divided up
- according to the same rules the CRTL C<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 L<times> keeps track of subprocesses separately. Note
- especially that the VAXCRTL (at least) keeps track only of
- subprocesses spawned using L<fork> and L<exec>; it will not
- accumulate the times of suprocesses spawned via pipes, L<system>,
- or backticks.
-
- =item unlink LIST
-
- C<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 C<unlink>,
- no files with the names passed to C<unlink> will exist.
- (Note: This can be changed at compile time by including
- C<#define UNLINK_ALL_VERSIONS> in config.h.
-
- C<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
- C<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;
- }
- Finally, if C<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.
-
- =item 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).
-
- =item waitpid PID,FLAGS
-
- If PID is a subprocess started by a piped L<open>, C<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, C<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 C<-w> switch, a warning will be issued.)
-
- The FLAGS argument is ignored in all cases.
-
- =head1 Revision date
-
- This document was last updated on 16-Dec-1994, for Perl 5,
- patchlevel 0.
-