require
EXPR
require
This function asserts a dependency of some kind on its argument. (If
EXPR
is not supplied,
$_
is used as the argument.)
If the argument is a string, this function includes and executes the Perl code found in the separate file whose name is given by the string. This is similar to performing an eval on the contents of the file, except that require checks to see that the library file has not been included already. (It can thus be used to express file dependencies without worrying about duplicate compilation.) The function also knows how to search the include path stored in the @INC array (see the section "Special Variables" in Chapter 2 ).
This form of the require function behaves much like this subroutine:
sub require { my($filename) = @_; return 1 if $INC{$filename}; my($realfilename, $result); ITER: { foreach $prefix (@INC) { $realfilename = "$prefix/$filename"; if (-f $realfilename) { $result = eval `cat $realfilename`; last ITER; } } die "Can't find $filename in \@INC"; } die $@ if $@; die "$filename did not return true value" unless $result; $INC{$filename} = $realfilename; return $result; }
Note that the file must return true as the last value to indicate successful execution of any initialization code, so it's customary to end such a file with
1;
unless you're sure it'll return true otherwise.
This operator differs from the now somewhat obsolete
do
EXPR
operator in that the file will not be included again if it was included previously with either a
require
or
do
EXPR
command, and any difficulties will be detected and reported as fatal errors (which may be trapped by use of
eval
). The
do
command does know how to do the
@INC
path search, however.
If
require
's argument is a number, the version number of the currently executing Perl binary (as known by
$]
) is compared to
EXPR
, and if smaller, execution is immediately aborted. Thus, a script that requires Perl version 5.003 can have as its first line:
require 5.003;
and earlier versions of Perl will abort.
If
require
's argument is a package name (see
package
),
require
assumes an automatic
.pm
suffix, making it easy to load standard modules. This is like
use
, except that it happens at run-time, not compile time, and the
import
routine is not called. For example, to pull in Socket.pm without introducing any symbols into the current package, say this:
require Socket; # instead of "use Socket;"
However, one can get the same effect with the following, which has the advantage of giving a compile-time warning if Socket.pm can't be located:
use Socket ();