Environment Variables
In addition to the various switches that explicitly modify Perl's behavior, you can set various environment variables to influence various underlying behaviors. How you set up these environment variables is system dependent, but one trick you should know if you use sh, ksh, or bash is that you can temporarily set an environment variable for a single command, as if it were a funny kind of switch. It has to be set in front of the command:
$
PATH="/bin:/usr/bin" perl myproggie
You can do something similar with a subshell in csh and tcsh:
%
(setenv PATH "/bin:/usr/bin"; perl myproggie)
Otherwise, you'd typically set environment variables in some file with a name resembling chsrc or profile in your home directory. Under csh and tcsh you'd say:
%
setenv PATH '/bin:/usr/bin'
And under sh, ksh, and bash you'd say:
$
PATH="/bin:/usr/bin"; export PATH
Other systems will have other ways of setting these on a semi-permanent basis. Here are the environment variables Perl pays attention to:
HOME
- Used if
chdir
is called without an argument. LC_ALL
,LC_CTYPE
,LC_COLLATE
,LC_NUMERIC
,PERL_BADLANG
- Environment variables that control how Perl handles data specific to particular natural languages. See the online docs for perllocale.
LOGDIR
- Used if
chdir
has no argument, butHOME
is not set. PATH
- Used in executing subprocesses, and for finding the program if the
-S
switch is used. PERL5LIB
- A colon-separated list of directories in which to look for Perl library files before looking in the standard library and the current directory. Any architecture-specific directories under the specified locations are automatically included if they exist. If
PERL5LIB
is not defined,PERLLIB
is consulted for backward compatibility with older releases.When running taint checks (either because the program was running setuid or setgid, or the
-T
switch was used), neither of these library variables is used. Such programs must employ theuse lib
pragma for that purpose. PERL5OPT
- Default command-line switches. Switches in this variable are taken as if they were on every Perl command line. Only the
-[DIMUdmw]
switches are allowed. When running taint checks (because the program was running setuid or setgid, or the-T
switch was used), this variable is ignored. IfPERL5OPT
begins with-T
, tainting will be enabled, causing any subsequent options to be ignored. PERL5DB
- The command used to load the debugger code. The default is:
BEGIN { require 'perl5db.pl' }
See "The Perl Debugger" for more uses of this variable. PERL5SHELL
(Microsoft ports only)- May be set to an alternative shell that Perl must use internally for executing commands via backticks or
system
. Default iscmd.exe /x/c
on WinNT andcommand.com /c
on Win95. The value is considered to be space separated. Precede any character that needs to be protected (like a space or backslash) with a backslash.Note that Perl doesn't use
COMSPEC
for this purpose becauseCOMSPEC
has a high degree of variability among users, leading to portability concerns. Besides, Perl can use a shell that may not be fit for interactive use, and settingCOMSPEC
to such a shell may interfere with the proper functioning of other programs (which usually look inCOMSPEC
to find a shell fit for interactive use). PERLLIB
- A colon-separated list of directories in which to look for Perl library files before looking in the standard library and the current directory. If
PERL5LIB
is defined,PERLLIB
is not used. PERL_DEBUG_MSTATS
- Relevant only if Perl is compiled with the
malloc
function included with the Perl distribution (that is, ifperl -V:d_mymalloc
yields "define
"). If set, this causes memory statistics to be displayed after execution. If set to an integer greater than one, also causes memory statistics to be displayed after compilation. PERL_DESTRUCT_LEVEL
- Relevant only if your Perl executable was built with debugging enabled, this controls the behavior of global destruction of objects and other references.
Apart from these, Perl itself uses no other environment variables, except to make them available to the program being executed and to any child processes that program launches. Some modules, standard or otherwise, may care about other environment variables. For example, the use re
pragma uses PERL_RE_TC
and PERL_RE_COLORS
, the Cwd
module uses PWD
, and the CGI
module uses the many environment variables set by your HTTP daemon (that is, your web server) to pass information to the CGI script.
Programs running setuid would do well to execute the following lines before doing anything else, just to keep people honest:
$ENV{PATH} = '/bin:/usr/bin'; # or whatever you need $ENV{SHELL} = '/bin/sh' if exists $ENV{SHELL}; delete @ENV{qw(IFS CDPATH ENV BASH_ENV)};
See "Security" for details.