(W) A warning (optional). (D) A deprecation (optional). (S) A severe warning (mandatory). (F) A fatal error (trappable). (P) An internal error you should never see (trappable). (X) A very fatal error (nontrappable). (A) An alien error message (not generated by Perl).
Optional warnings are enabled by using the -w switch. Warnings may be captured by setting $SIG{__WARN__}
to a reference to a routine that will be called on each warning instead of
printing it. See the perlvar manpage. Trappable errors may be trapped using the eval operator. See
eval.
Some of these messages are generic. Spots that vary are denoted with a %s,
just as in a printf format. Note that some messages start with a %s! The
symbols "%(-?@
sort before the letters, while [
and \
sort after.
local()
if you want to localize a package variable.
exists()
must be a hash element, such as
$foo{$bar} $ref->[12]->{"susie"}
delete()
must be either a hash element, such as
$foo{$bar} $ref->[12]->{"susie"}
or a hash slice, such as
@foo{$bar, $baz, $xyzzy} @{$ref->[12]}{"susie", "queue"}
perl -c
fails.
perl -c
succeeds.
-p
command-line switch. (This output goes to
STDOUT unless you've redirected it with
select().)
socket()
call? See
accept.
msgsnd()
requires a string at least as long as
sizeof(long).
To force interpretation as a subroutine call, either put an ampersand
before the subroutine name, or qualify the name with its package.
Alternatively, you can import the subroutine (or pretend that it's imported
with the use subs
pragma).
To silently interpret it as the Perl operator, use the CORE::
prefix on the operator (e.g. CORE::log($x)
) or by declaring the subroutine to be an object method (see the attrs manpage).
-w -U
into -wU
.
free_tmps()
routine. This indicates that something else is freeing the
SV before the
free_tmps()
routine gets a chance, which means that the
free_tmps()
routine will be freeing an unreferenced scalar when it does try to free it.
SvREFCNT_dec()
was called too many times, or that
SvREFCNT_inc()
was called too few times, or that the
SV was mortalized when it shouldn't have been, or that memory has been corrupted.
pack()
template. This means the result contains a pointer to a location that could become invalid anytime, even before the end of the current statement. Use literals or global values as arguments to the ``p''
pack()
template to avoid this warning.
substr()
used as an lvalue, which is pretty strange. Perhaps you forgot to dereference it first. See
substr.
msgctl(),
semctl()
or
shmctl().
In
C parlance, the correct sizes are, respectively,
sizeof(struct msqid_ds *), sizeof(struct semid_ds *), and
sizeof(struct shmid_ds *).
open(),
or did it in another package.
free()
on something that had never been
malloc()ed
in the first place. Mandatory, but can be disabled by setting environment variable
PERL_BADFREE
to 1.
This message can be quite often seen with DB_File on systems with ``hard''
dynamic linking, like AIX
and OS/2
. It is a bug of
Berkeley DB
which is left unnoticed if DB
uses forgiving
system
malloc().
$var = 'myvar'; $sym = mypack::$var;
is not the same as
$var = 'myvar'; $sym = "mypack::$var";
Foo::
, but the compiler saw no other uses of that namespace before that point.
Perhaps you need to predeclare a package?
BEGIN {}
subroutine (or a use directive, which implies a BEGIN {}
) after one or more compilation errors had already occurred. Since the
intended environment for the BEGIN {}
could not be guaranteed (due to the errors), and since subsequent code
likely depends on its correct operation, Perl just gave up.
socket()
call? See
bind.
perl_call_sv()
exited by calling exit.
sort()
block or subroutine, which is a no-no. See
goto.
sort().
You can usually double the curlies to get the same effect though, because the inner curlies will be considered a block that loops once. See
last.
sort().
You can usually double the curlies to get the same effect though, because the inner curlies will be considered a block that loops once. See
next.
sort().
You can usually double the curlies to get the same effect though, because the inner curlies will be considered a block that loops once. See
redo.
$BADREF = 42; process $BADREF 1,2,3; $BADREF->process(1,2,3);
$BADREF = undef; process $BADREF 1,2,3; $BADREF->process(1,2,3);
perl -x/foo/bar
, but /foo/bar
is not a directory that you can chdir to, possibly because it doesn't
exist.
*foo += 1;
You CAN say
$foo = *foo; $foo += 1;
but then $foo
no longer contains a glob.
-i.bak
, or some such.
setegid()
call failed for some reason in the setuid emulator of suidperl.
waitpid()
or
wait4(),
so only
waitpid()
without flags is emulated.
system(),
exec(),
or piped open call could not execute the named program for the indicated reason. Typical reasons include: the permissions were wrong on the file, the file wasn't found in
$ENV{PATH}
, the executable in question was compiled for another architecture, or the
#! line in a script points to an interpreter that can't be run for similar
reasons. (Or maybe your system doesn't support #! at all.)
print q(The character '(' starts a side comment.);
If you're getting this error from a here-document, you may have included unseen whitespace before or after your closing tag. A good programmer's editor will have a way to help you find these characters.
stat()
routine, because the device name is overwritten with each call. If this warning appears, the name lookup failed, and the access checking routine gave up and returned
FALSE, just to be conservative. (Note: The access checking routine knows about the Perl
stat operator and file tests, so you shouldn't ever see this warning in response
to a Perl command; it arises only if some internal code takes stat buffers
lightly.)
$GETSYI
how big you want your mailbox buffers to be, and didn't get an answer.
local $$ref
, which Perl can't currently handle, because when it goes to restore the old value of whatever $ref pointed to after the scope of the
local()
is finished, it can't be sure that $ref will still be a reference.
local $ar->{'key'}
, where $ar
is a reference to a pseudo-hash. That hasn't been
implemented yet, but you can get a similar effect by localizing the
corresponding array element directly -- local $ar->[$ar->[0]{'key'}]
.
AutoSplit
the file, say, by doing make install
.
@ISA
array contained the name of
another package that doesn't seem to exist.
%ENV
is not supported on some systems, notably
VMS.
substr()
was handed a
NULL.
<>
filehandle, either implicitly under the -n
or -p
command-line switches, or explicitly, failed for the indicated reason.
Usually this is because you don't have read permission for a file which you
named on the command line.
sort { &func } @x
instead of sort func @x
.
setreuid()
call failed for some reason in the setuid emulator of suidperl.
fstat()
the script even though you have it open already. Bizarre.
setreuid()
call failed for some reason in the setuid emulator of suidperl.
$!
errno values.
$a
and
$b
are reserved for sort comparisons. You mentioned
$a
or $b
in the same line as the <=> or
cmp operator, and the variable had earlier been declared as a lexical
variable. Either qualify the sort variable with the package name, or rename
the lexical variable.
ref()
function to test the type of the reference, if need be.
SCALAR(0xdecaf).
Use the $1
form instead.
CORE::word
was given to
prototype(),
but there is
no builtin with the name word
.
???
, this is an internal error.
chmod 777, $filename
not realizing that 777 will be interpreted as a decimal number, equivalent to 01411. Octal constants are introduced with a leading 0 in Perl, as in C.
while
) rather than in the regular expression engine; or rewriting the regular
expression so that it is simpler or backtracks less. (See the perlbook manpage
for information on Mastering Regular Expressions.)
socket()
call? See
connect.
<<FOO
, the label
FOO
is too long for Perl to handle. You have to be seriously twisted to write
code that triggers this error.
&FOO
as $FOO
or some such.
%hash
and got carried away.
die()
an empty string (the equivalent of
die "") or you called it with no args and both $@
and $_
were empty.
safemalloc()
instead.
free()
on something that had already been freed.
(?{ ... })
zero-width assertion, which is unsafe. See (?{ code }), and the perlsec manpage.
(?{ ... })
zero-width assertion, but that construct is only allowed when the use re 'eval'
pragma is in effect. See (?{ code }).
(?{ ... })
zero-width assertion at run time, as it would when the pattern contains interpolated values. Since that is a security risk, it is not allowed. If you insist, you may still do this by explicitly building the pattern from an interpolated string at run time and using that in an
eval().
See
(?{ code }).
glob()
operator, or put the filenames into a variable and glob that.
bless($ref,
$p
or 'MyPackage');
fcntl().
What is this, a
PDP-11 or something?
open()
or a
socket()
call, or call a constructor from the FileHandle package.
{ local $^W = 0; eval "format NAME =..."; }
if ($foo = 123)
when you meant
if ($foo == 123)
(or something like that).
gethostent(),
probably because if it did, it'd feel morally obligated to return every hostname on the Internet.
socket()
call?
sys$getuai
underlying the
getpwnam operator returned an invalid
UIC.
$A::B
). You've exceeded Perl's limits. Future versions of Perl are likely to
eliminate these arbitrary limitations.
%ENV
which violates the syntactic rules governing logical names. Because it cannot be translated normally, it is skipped, and will not appear in
%ENV. This may be a benign occurrence, as some software packages might directly modify logical name tables and introduce nonstandard names, or it may indicate that a logical name table has been corrupted.
print <<EOF;
).
Under Unix, this error is usually caused by executing Perl code -- either the main program, a module, or an eval'd string -- that was transferred over a network connection from a non-Unix system without properly converting the text file format.
Under systems that use something other than '\n' to delimit lines of text, this error can also be caused by reading Perl code from a file handle that is in binary mode (as set by the binmode operator).
In either case, the Perl code in question will probably need to be
converted with something like s/\x0D\x0A?/\n/g
before it can be executed.
system(),
exec(),
or a piped open in a setuid or setgid script if
$ENV{PATH}
contains a directory that is writable by the world. See the perlsec manpage.
system(),
exec(),
or a piped open in a setuid or setgid script if any of
$ENV{PATH}
, $ENV{IFS}
, $ENV{CDPATH}
,
$ENV{ENV}
or $ENV{BASH_ENV}
are derived from data supplied (or potentially supplied) by the user. The
script must set the path to a known value, using trustworthy data. See the perlsec manpage.
program(s)
used for
glob
and <*.c>
. This may mean that your csh
(C shell) is broken. If so, you should change all of
the csh-related variables in config.sh: If you have tcsh, make the
variables refer to it as if it were csh (e.g. full_csh='/usr/bin/tcsh'
); otherwise, make them all empty (except that d_csh
should be 'undef') so that Perl will think csh is missing. In either case, after editing
config.sh, run
./Configure -S
and rebuild Perl.
ioctl(),
which is pretty strange for a machine that supports
C.
socket()
call? See
listen.
sub mod { $_[0] = 1 } mod(2);
Another way is to assign to a
substr()
that's off the end
of the string.
$foo[1,2,3]
. They're written like $foo[1][2][3]
, as in
C.
use vars
pragma is provided for just this purpose.
Note, however, that the minimal matching quantifiers, *?
, +?
, and ??
appear to be nested quantifiers, but aren't. See the perlre manpage.
One possible cause for this is that you expected to have imported a constant to your name space with use or import while no such importing took place, it may for example be that your operating system does not support that particular constant. Hopefully you did use an explicit import list for the constants you expect to see, please see use and import. While an explicit import list would probably have caught this error earlier it naturally does not remedy the fact that your operating system still does not support that constant. Maybe you have a typo in the constants of the symbol import list of use or import or in the constant name at the line where this error was triggered?
perl -x
, but no line was found in the file beginning with #! and containing the
word ``perl''.
setregid()
call for your system.
setreuid()
call for your system.
%FIELDS
hash in the type package at compile
time. The %FIELDS
hash is usually set up with the 'fields'
pragma.
my_pclose()
tried to close a pipe which hadn't been opened. This should have been caught earlier as an attempt to close an unopened filehandle.
%SIG
that was not recognized. Say kill -l
in your shell to see the valid signal names on your system.
ref()
function to find out what kind of ref it really was. See also
the perlref manpage.
*foo
), but found a reference to something else instead. You can use the
ref()
function to find out what
kind of ref it really was. See the perlref manpage.
ref()
function to find out what kind of ref it really was. See
the perlref manpage.
ref()
function to find out what kind of ref it really was. See
the perlref manpage.
ref()
function to find out what kind of ref it really was. See also
the perlref manpage.
ref()
function to find out what kind of ref it really was. See
the perlref manpage.
run()
with a null opcode pointer.
fallback
overloading key is specified to be true. See the overload manpage.
realloc()
wouldn't give it more memory, virtual or otherwise.
malloc()
function returned 0, indicating there was insufficient remaining memory (or virtual memory) to satisfy the request.
The request was judged to be small, so the possibility to trap it depends
on the way perl was compiled. By default it is not trappable. However, if
compiled for this, Perl may use the contents of $^M
as an emergency pool after
die()ing
with this message.
In this case the error is trappable once.
malloc()
function returned 0, indicating there was insufficient remaining memory (or virtual memory) to satisfy the request. However, the request was judged large enough (compile-time default is
64K), so a possibility to shut down by trapping this error is granted.
$arr[time]
instead of $arr[$time]
.
write()
produced more lines than can fit on a page. See
the perlform manpage.
pp_match()
routine was called with invalid operational data.
pp_subst()
routine was called with invalid operational data.
do_trans()
routine was called with invalid operational data.
frexp()
failed, making
printf(``%f'')
impossible.
map()
function.
scan_num()
got called on something that wasn't a number.
sv_insert()
routine was told to remove more string than there was string.
my $foo, $bar = @_;
when you meant
my ($foo, $bar) = @_;
Remember that ``my'' and ``local'' bind closer than comma.
Waitpid()
was asked to wait for a process which isn't a subprocess of the current process. While this is fine from
VMS' perspective, it's probably not what you intended.
getpgrp(),
which takes no argument, unlike the
BSD version, which takes a pid.
qw()
lists contain items separated by whitespace; as with literal strings, comment characters are not ignored, but are instead treated as literal data. (You may have used different delimiters than the parentheses shown here; braces are also frequently used.)
You probably wrote something like this:
@list = qw( a # a comment b # another comment );
when you should have written this:
@list = qw( a b );
If you really want comments, build your list the old-fashioned way, with quotes and commas:
@list = ( 'a', # a comment 'b', # another comment );
qw()
lists contain items separated by whitespace; therefore commas aren't needed to separate the items. (You may have used different delimiters than the parentheses shown here; braces are also frequently used.)
You probably wrote something like this:
qw! a, b, c !;
which puts literal commas into some of the list items. Write it without commas if you don't want them to appear in your data:
qw! a b c !;
ioctl()
or
fcntl()
returned more than Perl was bargaining for. Perl guesses a reasonable buffer size, but puts a sentinel byte at the end of the buffer just in case. This sentinel byte got clobbered, and Perl assumes that memory is now corrupted. See
ioctl.
open FOO || die;
is now misinterpreted as
open(FOO || die);
because of the strict regularization of Perl 5's grammar into unary and list operators. (The old open was a little of both.) You must put parentheses around the filehandle, or use the new ``or'' operator instead of ``||''.
open FOO || die;
%hash = { one => 1, two => 2, }; # WRONG %hash = [ qw/ an anon array / ]; # WRONG %hash = ( one => 1, two => 2, ); # right %hash = qw( one 1 two 2 ); # also fine
sv_replace()
function was handed a new
SV with a reference count of other than 1.
safemalloc()
should have caught it earlier.
$foo[&bar]
always behaves like a scalar, both when assigning to it and when evaluating
its argument, while @foo[&bar]
behaves like a list when you assign to it, and provides a list context to
its subscript, which can do weird things if you're expecting only one
subscript.
On the other hand, if you were actually hoping to treat the array element as a list, you need to look into how references work, because Perl will not magically convert between scalars and lists for you. See the perlref manpage.
$foo{&bar}
always behaves like a scalar, both when assigning to it and when evaluating
its argument, while @foo{&bar}
behaves like a list when you assign to it, and provides a list context to
its subscript, which can do weird things if you're expecting only one
subscript.
On the other hand, if you were actually hoping to treat the hash element as a list, you need to look into how references work, because Perl will not magically convert between scalars and lists for you. See the perlref manpage.
$
from a variable $m may cause this error.
seek()
or
sysseek()
function on a filehandle that was either never opened or has since been closed.
select()
system call.
newSVsv()
routine was called to duplicate a scalar that had previously been marked as free.
This is a CGI error, not a Perl error.
You need to make sure your script is executable, is accessible by the user CGI is running the script under (which is probably not the user account you tested it under), does not rely on any environment variables (like PATH) from the user it isn't running under, and isn't in a location where the CGI server can't find it, basically, more or less. Please see the following for more information:
http://www.perl.com/perl/faq/idiots-guide.html http://www.perl.com/perl/faq/perl-cgi-faq.html ftp://rtfm.mit.edu/pub/usenet/news.answers/www/cgi-faq http://hoohoo.ncsa.uiuc.edu/cgi/interface.html http://www-genome.wi.mit.edu/WWW/faqs/www-security-faq.html
$)
, and your operating system doesn't support the
setegid()
system call (or
equivalent), or at least Configure didn't think so.
$>
, and your operating system doesn't support the
seteuid()
system call (or
equivalent), or at least Configure didn't think so.
$(
, and your operating system doesn't support the
setrgid()
system call (or
equivalent), or at least Configure didn't think so.
$<
, and your operating system doesn't support the
setruid()
system call (or
equivalent), or at least Configure didn't think so.
%SIG
doesn't, in fact, exist. Perhaps you put it into the wrong package?
<=>
or cmp
, or by not using them correctly. See sort.
stat()
function (or an equivalent file test) on a filehandle that was either never opened or has since been closed.
exec()
with some statement after it other than a
die().
This is almost always an error, because
exec()
never returns unless there was a failure. You probably wanted to use
system()
instead, which does return. To suppress this warning, put the
exec()
in a block by itself.
@ISA
tree
may be broken by importation stubs. Stubs should never be implicitely
created, but explicit calls to can
may break this.
{ local $^W = 0; eval "sub name { ... }"; }
$
from variable $s may cause this error.
$
from variable $s may cause this error.
substr()
that pointed outside of a string. That is, the absolute value of the offset was larger than the length of the string. See
substr. This warning is mandatory if substr is used in an lvalue context (as the
left hand side of an assignment or as a subroutine argument for example).
A keyword is misspelled. A semicolon is missing. A comma is missing. An opening or closing parenthesis is missing. An opening or closing brace is missing. A closing quote is missing.
Often there will be another error message associated with the syntax error
giving more information. (Sometimes it helps to turn on -w.) The error message itself often tells you where it was in the line when
it decided to give up. Sometimes the actual error is several tokens before
this, because Perl is good at understanding random input. Occasionally the
line number may be misleading, and once in a blue moon the only way to
figure out what's triggering the error is to call
perl -c
repeatedly, chopping away half the program each time to see if the error
went away. Sort of the cybernetic version of 20 questions.
tell()
function on a filehandle that was either never opened or has since been closed.
$[
is now strictly circumscribed, and interpreted as a compiler directive. You
may say only one of
$[ = 0; $[ = 1; ... local $[ = 0; local $[ = 1; ...
This is to prevent the problem of one module changing the array base out from under another module inadvertently. See $[.
crypt()
function on your machine, probably because your vendor didn't supply it, probably because they think the
U.S. Government thinks it's a secret, or at least that they will continue to pretend that it is. And if you quote me on that,
I will deny it.
times().
I suspect you're not running on Unix.
syscall()
to specify the system call to call, silly dilly.
If the Perl script is being executed as a command using the #! mechanism
(or its local equivalent), this error can usually be fixed by editing the
#! line so that the -T option is a part of Perl's first argument: e.g. change perl -n -T
to perl -T -n
.
If the Perl script is being executed as perl scriptname
, then the
-T option must appear on the command line: perl -T scriptname
.
syscall().
$
from variables
$tr or $y may cause this error.
@NAME
or @{EXPR}
. Hashes must be %NAME
or %{EXPR}
. No implicit dereferencing is allowed--use the
{EXPR} forms as an explicit dereference. See the perlref manpage.
*foo = undef
. This does nothing. It's possible that you really mean undef *foo
.
unexec()
routine failed for some reason. See your local
FSF representative, who probably put it there in the first place.
kill()
function that was not recognized. Say
kill -l
in your shell to see the valid signal names on your system.
chop()
or
chomp()
it off. See
chomp.
opendir()
and
readdir().
Note that under some systems, like
OS/2, there may be different flavors of Perl
executables, some of which may support fork, some not. Try changing the
name you call Perl by to perl_
, perl__
, and so on.
However, the developers of Perl 5.004 could not fix this bug completely, because at least two widely-used modules depend on the old meaning of ``$$0'' in a string. So Perl 5.004 still interprets ``$$<digit>'' in the old (broken) way inside strings; but it generates this message as a warning. And in Perl 5.005, this special treatment will cease.
printf()
or
sprintf()
instead.
$*
.
split()
explicitly to an array (or list).
AUTOLOAD
subroutines are looked up as methods (using the @ISA
hierarchy) even when the subroutines to be autoloaded were called as plain
functions (e.g. Foo::bar()
), not as methods (e.g. Foo->bar()
or $obj->bar()
).
This bug will be rectified in Perl 5.005, which will use method lookup only
for methods' AUTOLOAD
s. However, there is a significant base of existing code that may be using
the old behavior. So, as an interim step, Perl 5.004 issues an optional
warning when non-methods use inherited AUTOLOAD
s.
The simple rule is: Inheritance will not work when autoloading non-methods.
The simple fix for old code is: In any module that used to depend on
inheriting AUTOLOAD
for non-methods from a base class named
BaseClass
, execute *AUTOLOAD = \&BaseClass::AUTOLOAD
during startup.
In code that currently says use AutoLoader; @ISA = qw(AutoLoader);
you should remove AutoLoader from @ISA
and change use AutoLoader;
to
use AutoLoader 'AUTOLOAD';
.
&
prefix, or using a package qualifier, e.g. &our()
, or Foo::our()
.
use re;
without any arguments. That isn't very useful.
$one, $two = 1, 2;
when you meant to say
($one, $two) = (1, 2);
Another common error is to use ordinary parentheses to construct a list reference when you should be using square or curly brackets, for example, if you say
$array = (1,2);
when you should have said
$array = [1,2];
The square brackets explicitly turn a list value into a scalar value, while parentheses do not. So when a parenthesized list is evaluated in a scalar context, the comma is treated like C's comma operator, which throws away the left argument, which is not what you want. See the perlref manpage for more on this.
tied
) was still valid when untie was called.
sub outermost { my $a; sub middle { sub { $a } } }
If the anonymous subroutine is called or referenced (directly or indirectly) from the outermost subroutine, it will share the variable as you would expect. But if the anonymous subroutine is called or referenced when the outermost subroutine is not active, it will see the value of the shared variable as it was before and during the *first* call to the outermost subroutine, which is probably not what you want.
In these circumstances, it is usually best to make the middle subroutine anonymous, using the sub {} syntax. Perl has specific support for shared variables in nested anonymous subroutines; a named subroutine in between interferes with this feature.
When the inner subroutine is called, it will probably see the value of the outer subroutine's variable as it was before and during the *first* call to the outer subroutine; in this case, after the first call to the outer subroutine is complete, the inner and outer subroutines will no longer share a common value for the variable. In other words, the variable will no longer be shared.
Furthermore, if the outer subroutine is anonymous and references a lexical variable outside itself, then the outer and inner subroutines will never share the given variable.
This problem can usually be solved by making the inner subroutine anonymous, using the sub {} syntax. When inner anonymous subs that reference variables in outer subroutines are called or referenced, they are automatically rebound to the current values of such variables.
perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LC_ALL = "En_US", LANG = (unset) are supported and installed on your system. perl: warning: Falling back to the standard locale ("C").
Exactly what were the failed locale settings varies. In the above the settings were that the LC_ALL was ``En_US'' and the LANG had no value. This error means that Perl detected that you and/or your system administrator have set up the so-called variable system but Perl could not use those settings. This was not dead serious, fortunately: there is a ``default locale'' called ``C'' that Perl can and will use, the script will be run. Before you really fix the problem, however, you will get the same error message each time you run Perl. How to really fix the problem can be found in the perllocale manpage section LOCALE PROBLEMS.
warn()
an empty string (the equivalent of
warn "") or you called it with no args and $_
was empty.
close()
done by an
open()
got an error indication on the
close().
This usually indicates your file system ran out of disk space.
rand + 5;
you may THINK you wrote the same thing as
rand() + 5;
but in actual fact, you got
rand(+5);
So put in parentheses to say what you really mean.
socket()
call? See
getsockopt.
open(OUT,">$ARGV[0]") or die "Can't write to $ARGV[0]: $!"; while (<STDIN>) { print; print OUT; } close OUT;
prefix1;prefix2
or
prefix1 prefix2
with nonempty prefix1 and prefix2. If prefix1
is indeed a prefix of a builtin library search path, prefix2 is substituted. The error may appear if components are not found, or are too long. See
``PERLLIB_PREFIX'' in
README.os2.
sh
-shell in. See
``PERL_SH_DIR'' in README.os2.
*nix
applications die in silence. It is considered a feature of the
OS/2 port. One can easily disable this by appropriate sighandlers, see
Signals. See also ``Process terminated by
SIGTERM/SIGINT'' in README.os2.
These messages are classified as follows (listed in increasing order of desperation):
(W) A warning (optional). (D) A deprecation (optional). (S) A severe warning (mandatory). (F) A fatal error (trappable). (P) An internal error you should never see (trappable). (X) A very fatal error (nontrappable). (A) An alien error message (not generated by Perl).
Optional warnings are enabled by using the -w switch. Warnings may be captured by setting $SIG{__WARN__}
to a reference to a routine that will be called on each warning instead of
printing it. See the perlvar manpage. Trappable errors may be trapped using the eval operator. See
eval.
Some of these messages are generic. Spots that vary are denoted with a %s,
just as in a printf format. Note that some messages start with a %s! The
symbols "%(-?@
sort before the letters, while [
and \
sort after.
local()
if you want to localize a package variable.
exists()
must be a hash element, such as
$foo{$bar} $ref->[12]->{"susie"}
delete()
must be either a hash element, such as
$foo{$bar} $ref->[12]->{"susie"}
or a hash slice, such as
@foo{$bar, $baz, $xyzzy} @{$ref->[12]}{"susie", "queue"}
perl -c
fails.
perl -c
succeeds.
-p
command-line switch. (This output goes to
STDOUT unless you've redirected it with
select().)
socket()
call? See
accept.
msgsnd()
requires a string at least as long as
sizeof(long).
To force interpretation as a subroutine call, either put an ampersand
before the subroutine name, or qualify the name with its package.
Alternatively, you can import the subroutine (or pretend that it's imported
with the use subs
pragma).
To silently interpret it as the Perl operator, use the CORE::
prefix on the operator (e.g. CORE::log($x)
) or by declaring the subroutine to be an object method (see the attrs manpage).
-w -U
into -wU
.
free_tmps()
routine. This indicates that something else is freeing the
SV before the
free_tmps()
routine gets a chance, which means that the
free_tmps()
routine will be freeing an unreferenced scalar when it does try to free it.
SvREFCNT_dec()
was called too many times, or that
SvREFCNT_inc()
was called too few times, or that the
SV was mortalized when it shouldn't have been, or that memory has been corrupted.
pack()
template. This means the result contains a pointer to a location that could become invalid anytime, even before the end of the current statement. Use literals or global values as arguments to the ``p''
pack()
template to avoid this warning.
substr()
used as an lvalue, which is pretty strange. Perhaps you forgot to dereference it first. See
substr.
msgctl(),
semctl()
or
shmctl().
In
C parlance, the correct sizes are, respectively,
sizeof(struct msqid_ds *), sizeof(struct semid_ds *), and
sizeof(struct shmid_ds *).
open(),
or did it in another package.
free()
on something that had never been
malloc()ed
in the first place. Mandatory, but can be disabled by setting environment variable
PERL_BADFREE
to 1.
This message can be quite often seen with DB_File on systems with ``hard''
dynamic linking, like AIX
and OS/2
. It is a bug of
Berkeley DB
which is left unnoticed if DB
uses forgiving
system
malloc().
$var = 'myvar'; $sym = mypack::$var;
is not the same as
$var = 'myvar'; $sym = "mypack::$var";
Foo::
, but the compiler saw no other uses of that namespace before that point.
Perhaps you need to predeclare a package?
BEGIN {}
subroutine (or a use directive, which implies a BEGIN {}
) after one or more compilation errors had already occurred. Since the
intended environment for the BEGIN {}
could not be guaranteed (due to the errors), and since subsequent code
likely depends on its correct operation, Perl just gave up.
socket()
call? See
bind.
perl_call_sv()
exited by calling exit.
sort()
block or subroutine, which is a no-no. See
goto.
sort().
You can usually double the curlies to get the same effect though, because the inner curlies will be considered a block that loops once. See
last.
sort().
You can usually double the curlies to get the same effect though, because the inner curlies will be considered a block that loops once. See
next.
sort().
You can usually double the curlies to get the same effect though, because the inner curlies will be considered a block that loops once. See
redo.
$BADREF = 42; process $BADREF 1,2,3; $BADREF->process(1,2,3);
$BADREF = undef; process $BADREF 1,2,3; $BADREF->process(1,2,3);
perl -x/foo/bar
, but /foo/bar
is not a directory that you can chdir to, possibly because it doesn't
exist.
*foo += 1;
You CAN say
$foo = *foo; $foo += 1;
but then $foo
no longer contains a glob.
-i.bak
, or some such.
setegid()
call failed for some reason in the setuid emulator of suidperl.
waitpid()
or
wait4(),
so only
waitpid()
without flags is emulated.
system(),
exec(),
or piped open call could not execute the named program for the indicated reason. Typical reasons include: the permissions were wrong on the file, the file wasn't found in
$ENV{PATH}
, the executable in question was compiled for another architecture, or the
#! line in a script points to an interpreter that can't be run for similar
reasons. (Or maybe your system doesn't support #! at all.)
print q(The character '(' starts a side comment.);
If you're getting this error from a here-document, you may have included unseen whitespace before or after your closing tag. A good programmer's editor will have a way to help you find these characters.
stat()
routine, because the device name is overwritten with each call. If this warning appears, the name lookup failed, and the access checking routine gave up and returned
FALSE, just to be conservative. (Note: The access checking routine knows about the Perl
stat operator and file tests, so you shouldn't ever see this warning in response
to a Perl command; it arises only if some internal code takes stat buffers
lightly.)
$GETSYI
how big you want your mailbox buffers to be, and didn't get an answer.
local $$ref
, which Perl can't currently handle, because when it goes to restore the old value of whatever $ref pointed to after the scope of the
local()
is finished, it can't be sure that $ref will still be a reference.
local $ar->{'key'}
, where $ar
is a reference to a pseudo-hash. That hasn't been
implemented yet, but you can get a similar effect by localizing the
corresponding array element directly -- local $ar->[$ar->[0]{'key'}]
.
AutoSplit
the file, say, by doing make install
.
@ISA
array contained the name of
another package that doesn't seem to exist.
%ENV
is not supported on some systems, notably
VMS.
substr()
was handed a
NULL.
<>
filehandle, either implicitly under the -n
or -p
command-line switches, or explicitly, failed for the indicated reason.
Usually this is because you don't have read permission for a file which you
named on the command line.
sort { &func } @x
instead of sort func @x
.
setreuid()
call failed for some reason in the setuid emulator of suidperl.
fstat()
the script even though you have it open already. Bizarre.
setreuid()
call failed for some reason in the setuid emulator of suidperl.
$!
errno values.
$a
and
$b
are reserved for sort comparisons. You mentioned
$a
or $b
in the same line as the <=> or
cmp operator, and the variable had earlier been declared as a lexical
variable. Either qualify the sort variable with the package name, or rename
the lexical variable.
ref()
function to test the type of the reference, if need be.
SCALAR(0xdecaf).
Use the $1
form instead.
CORE::word
was given to
prototype(),
but there is
no builtin with the name word
.
???
, this is an internal error.
chmod 777, $filename
not realizing that 777 will be interpreted as a decimal number, equivalent to 01411. Octal constants are introduced with a leading 0 in Perl, as in C.
while
) rather than in the regular expression engine; or rewriting the regular
expression so that it is simpler or backtracks less. (See the perlbook manpage
for information on Mastering Regular Expressions.)
socket()
call? See
connect.
<<FOO
, the label
FOO
is too long for Perl to handle. You have to be seriously twisted to write
code that triggers this error.
&FOO
as $FOO
or some such.
%hash
and got carried away.
die()
an empty string (the equivalent of
die "") or you called it with no args and both $@
and $_
were empty.
safemalloc()
instead.
free()
on something that had already been freed.
(?{ ... })
zero-width assertion, which is unsafe. See (?{ code }), and the perlsec manpage.
(?{ ... })
zero-width assertion, but that construct is only allowed when the use re 'eval'
pragma is in effect. See (?{ code }).
(?{ ... })
zero-width assertion at run time, as it would when the pattern contains interpolated values. Since that is a security risk, it is not allowed. If you insist, you may still do this by explicitly building the pattern from an interpolated string at run time and using that in an
eval().
See
(?{ code }).
glob()
operator, or put the filenames into a variable and glob that.
bless($ref,
$p
or 'MyPackage');
fcntl().
What is this, a
PDP-11 or something?
open()
or a
socket()
call, or call a constructor from the FileHandle package.
{ local $^W = 0; eval "format NAME =..."; }
if ($foo = 123)
when you meant
if ($foo == 123)
(or something like that).
gethostent(),
probably because if it did, it'd feel morally obligated to return every hostname on the Internet.
socket()
call?
sys$getuai
underlying the
getpwnam operator returned an invalid
UIC.
$A::B
). You've exceeded Perl's limits. Future versions of Perl are likely to
eliminate these arbitrary limitations.
%ENV
which violates the syntactic rules governing logical names. Because it cannot be translated normally, it is skipped, and will not appear in
%ENV. This may be a benign occurrence, as some software packages might directly modify logical name tables and introduce nonstandard names, or it may indicate that a logical name table has been corrupted.
print <<EOF;
).
Under Unix, this error is usually caused by executing Perl code -- either the main program, a module, or an eval'd string -- that was transferred over a network connection from a non-Unix system without properly converting the text file format.
Under systems that use something other than '\n' to delimit lines of text, this error can also be caused by reading Perl code from a file handle that is in binary mode (as set by the binmode operator).
In either case, the Perl code in question will probably need to be
converted with something like s/\x0D\x0A?/\n/g
before it can be executed.
system(),
exec(),
or a piped open in a setuid or setgid script if
$ENV{PATH}
contains a directory that is writable by the world. See the perlsec manpage.
system(),
exec(),
or a piped open in a setuid or setgid script if any of
$ENV{PATH}
, $ENV{IFS}
, $ENV{CDPATH}
,
$ENV{ENV}
or $ENV{BASH_ENV}
are derived from data supplied (or potentially supplied) by the user. The
script must set the path to a known value, using trustworthy data. See the perlsec manpage.
program(s)
used for
glob
and <*.c>
. This may mean that your csh
(C shell) is broken. If so, you should change all of
the csh-related variables in config.sh: If you have tcsh, make the
variables refer to it as if it were csh (e.g. full_csh='/usr/bin/tcsh'
); otherwise, make them all empty (except that d_csh
should be 'undef') so that Perl will think csh is missing. In either case, after editing
config.sh, run
./Configure -S
and rebuild Perl.
ioctl(),
which is pretty strange for a machine that supports
C.
socket()
call? See
listen.
sub mod { $_[0] = 1 } mod(2);
Another way is to assign to a
substr()
that's off the end
of the string.
$foo[1,2,3]
. They're written like $foo[1][2][3]
, as in
C.
use vars
pragma is provided for just this purpose.
Note, however, that the minimal matching quantifiers, *?
, +?
, and ??
appear to be nested quantifiers, but aren't. See the perlre manpage.
One possible cause for this is that you expected to have imported a constant to your name space with use or import while no such importing took place, it may for example be that your operating system does not support that particular constant. Hopefully you did use an explicit import list for the constants you expect to see, please see use and import. While an explicit import list would probably have caught this error earlier it naturally does not remedy the fact that your operating system still does not support that constant. Maybe you have a typo in the constants of the symbol import list of use or import or in the constant name at the line where this error was triggered?
perl -x
, but no line was found in the file beginning with #! and containing the
word ``perl''.
setregid()
call for your system.
setreuid()
call for your system.
%FIELDS
hash in the type package at compile
time. The %FIELDS
hash is usually set up with the 'fields'
pragma.
my_pclose()
tried to close a pipe which hadn't been opened. This should have been caught earlier as an attempt to close an unopened filehandle.
%SIG
that was not recognized. Say kill -l
in your shell to see the valid signal names on your system.
ref()
function to find out what kind of ref it really was. See also
the perlref manpage.
*foo
), but found a reference to something else instead. You can use the
ref()
function to find out what
kind of ref it really was. See the perlref manpage.
ref()
function to find out what kind of ref it really was. See
the perlref manpage.
ref()
function to find out what kind of ref it really was. See
the perlref manpage.
ref()
function to find out what kind of ref it really was. See also
the perlref manpage.
ref()
function to find out what kind of ref it really was. See
the perlref manpage.
run()
with a null opcode pointer.
fallback
overloading key is specified to be true. See the overload manpage.
realloc()
wouldn't give it more memory, virtual or otherwise.
malloc()
function returned 0, indicating there was insufficient remaining memory (or virtual memory) to satisfy the request.
The request was judged to be small, so the possibility to trap it depends
on the way perl was compiled. By default it is not trappable. However, if
compiled for this, Perl may use the contents of $^M
as an emergency pool after
die()ing
with this message.
In this case the error is trappable once.
malloc()
function returned 0, indicating there was insufficient remaining memory (or virtual memory) to satisfy the request. However, the request was judged large enough (compile-time default is
64K), so a possibility to shut down by trapping this error is granted.
$arr[time]
instead of $arr[$time]
.
write()
produced more lines than can fit on a page. See
the perlform manpage.
pp_match()
routine was called with invalid operational data.
pp_subst()
routine was called with invalid operational data.
do_trans()
routine was called with invalid operational data.
frexp()
failed, making
printf(``%f'')
impossible.
map()
function.
scan_num()
got called on something that wasn't a number.
sv_insert()
routine was told to remove more string than there was string.
my $foo, $bar = @_;
when you meant
my ($foo, $bar) = @_;
Remember that ``my'' and ``local'' bind closer than comma.
Waitpid()
was asked to wait for a process which isn't a subprocess of the current process. While this is fine from
VMS' perspective, it's probably not what you intended.
getpgrp(),
which takes no argument, unlike the
BSD version, which takes a pid.
qw()
lists contain items separated by whitespace; as with literal strings, comment characters are not ignored, but are instead treated as literal data. (You may have used different delimiters than the parentheses shown here; braces are also frequently used.)
You probably wrote something like this:
@list = qw( a # a comment b # another comment );
when you should have written this:
@list = qw( a b );
If you really want comments, build your list the old-fashioned way, with quotes and commas:
@list = ( 'a', # a comment 'b', # another comment );
qw()
lists contain items separated by whitespace; therefore commas aren't needed to separate the items. (You may have used different delimiters than the parentheses shown here; braces are also frequently used.)
You probably wrote something like this:
qw! a, b, c !;
which puts literal commas into some of the list items. Write it without commas if you don't want them to appear in your data:
qw! a b c !;
ioctl()
or
fcntl()
returned more than Perl was bargaining for. Perl guesses a reasonable buffer size, but puts a sentinel byte at the end of the buffer just in case. This sentinel byte got clobbered, and Perl assumes that memory is now corrupted. See
ioctl.
open FOO || die;
is now misinterpreted as
open(FOO || die);
because of the strict regularization of Perl 5's grammar into unary and list operators. (The old open was a little of both.) You must put parentheses around the filehandle, or use the new ``or'' operator instead of ``||''.
open FOO || die;
%hash = { one => 1, two => 2, }; # WRONG %hash = [ qw/ an anon array / ]; # WRONG %hash = ( one => 1, two => 2, ); # right %hash = qw( one 1 two 2 ); # also fine
sv_replace()
function was handed a new
SV with a reference count of other than 1.
safemalloc()
should have caught it earlier.
$foo[&bar]
always behaves like a scalar, both when assigning to it and when evaluating
its argument, while @foo[&bar]
behaves like a list when you assign to it, and provides a list context to
its subscript, which can do weird things if you're expecting only one
subscript.
On the other hand, if you were actually hoping to treat the array element as a list, you need to look into how references work, because Perl will not magically convert between scalars and lists for you. See the perlref manpage.
$foo{&bar}
always behaves like a scalar, both when assigning to it and when evaluating
its argument, while @foo{&bar}
behaves like a list when you assign to it, and provides a list context to
its subscript, which can do weird things if you're expecting only one
subscript.
On the other hand, if you were actually hoping to treat the hash element as a list, you need to look into how references work, because Perl will not magically convert between scalars and lists for you. See the perlref manpage.
$
from a variable $m may cause this error.
seek()
or
sysseek()
function on a filehandle that was either never opened or has since been closed.
select()
system call.
newSVsv()
routine was called to duplicate a scalar that had previously been marked as free.
This is a CGI error, not a Perl error.
You need to make sure your script is executable, is accessible by the user CGI is running the script under (which is probably not the user account you tested it under), does not rely on any environment variables (like PATH) from the user it isn't running under, and isn't in a location where the CGI server can't find it, basically, more or less. Please see the following for more information:
http://www.perl.com/perl/faq/idiots-guide.html http://www.perl.com/perl/faq/perl-cgi-faq.html ftp://rtfm.mit.edu/pub/usenet/news.answers/www/cgi-faq http://hoohoo.ncsa.uiuc.edu/cgi/interface.html http://www-genome.wi.mit.edu/WWW/faqs/www-security-faq.html
$)
, and your operating system doesn't support the
setegid()
system call (or
equivalent), or at least Configure didn't think so.
$>
, and your operating system doesn't support the
seteuid()
system call (or
equivalent), or at least Configure didn't think so.
$(
, and your operating system doesn't support the
setrgid()
system call (or
equivalent), or at least Configure didn't think so.
$<
, and your operating system doesn't support the
setruid()
system call (or
equivalent), or at least Configure didn't think so.
%SIG
doesn't, in fact, exist. Perhaps you put it into the wrong package?
<=>
or cmp
, or by not using them correctly. See sort.
stat()
function (or an equivalent file test) on a filehandle that was either never opened or has since been closed.
exec()
with some statement after it other than a
die().
This is almost always an error, because
exec()
never returns unless there was a failure. You probably wanted to use
system()
instead, which does return. To suppress this warning, put the
exec()
in a block by itself.
@ISA
tree
may be broken by importation stubs. Stubs should never be implicitely
created, but explicit calls to can
may break this.
{ local $^W = 0; eval "sub name { ... }"; }
$
from variable $s may cause this error.
$
from variable $s may cause this error.
substr()
that pointed outside of a string. That is, the absolute value of the offset was larger than the length of the string. See
substr. This warning is mandatory if substr is used in an lvalue context (as the
left hand side of an assignment or as a subroutine argument for example).
A keyword is misspelled. A semicolon is missing. A comma is missing. An opening or closing parenthesis is missing. An opening or closing brace is missing. A closing quote is missing.
Often there will be another error message associated with the syntax error
giving more information. (Sometimes it helps to turn on -w.) The error message itself often tells you where it was in the line when
it decided to give up. Sometimes the actual error is several tokens before
this, because Perl is good at understanding random input. Occasionally the
line number may be misleading, and once in a blue moon the only way to
figure out what's triggering the error is to call
perl -c
repeatedly, chopping away half the program each time to see if the error
went away. Sort of the cybernetic version of 20 questions.
tell()
function on a filehandle that was either never opened or has since been closed.
$[
is now strictly circumscribed, and interpreted as a compiler directive. You
may say only one of
$[ = 0; $[ = 1; ... local $[ = 0; local $[ = 1; ...
This is to prevent the problem of one module changing the array base out from under another module inadvertently. See $[.
crypt()
function on your machine, probably because your vendor didn't supply it, probably because they think the
U.S. Government thinks it's a secret, or at least that they will continue to pretend that it is. And if you quote me on that,
I will deny it.
times().
I suspect you're not running on Unix.
syscall()
to specify the system call to call, silly dilly.
If the Perl script is being executed as a command using the #! mechanism
(or its local equivalent), this error can usually be fixed by editing the
#! line so that the -T option is a part of Perl's first argument: e.g. change perl -n -T
to perl -T -n
.
If the Perl script is being executed as perl scriptname
, then the
-T option must appear on the command line: perl -T scriptname
.
syscall().
$
from variables
$tr or $y may cause this error.
@NAME
or @{EXPR}
. Hashes must be %NAME
or %{EXPR}
. No implicit dereferencing is allowed--use the
{EXPR} forms as an explicit dereference. See the perlref manpage.
*foo = undef
. This does nothing. It's possible that you really mean undef *foo
.
unexec()
routine failed for some reason. See your local
FSF representative, who probably put it there in the first place.
kill()
function that was not recognized. Say
kill -l
in your shell to see the valid signal names on your system.
chop()
or
chomp()
it off. See
chomp.
opendir()
and
readdir().
Note that under some systems, like
OS/2, there may be different flavors of Perl
executables, some of which may support fork, some not. Try changing the
name you call Perl by to perl_
, perl__
, and so on.
However, the developers of Perl 5.004 could not fix this bug completely, because at least two widely-used modules depend on the old meaning of ``$$0'' in a string. So Perl 5.004 still interprets ``$$<digit>'' in the old (broken) way inside strings; but it generates this message as a warning. And in Perl 5.005, this special treatment will cease.
printf()
or
sprintf()
instead.
$*
.
split()
explicitly to an array (or list).
AUTOLOAD
subroutines are looked up as methods (using the @ISA
hierarchy) even when the subroutines to be autoloaded were called as plain
functions (e.g. Foo::bar()
), not as methods (e.g. Foo->bar()
or $obj->bar()
).
This bug will be rectified in Perl 5.005, which will use method lookup only
for methods' AUTOLOAD
s. However, there is a significant base of existing code that may be using
the old behavior. So, as an interim step, Perl 5.004 issues an optional
warning when non-methods use inherited AUTOLOAD
s.
The simple rule is: Inheritance will not work when autoloading non-methods.
The simple fix for old code is: In any module that used to depend on
inheriting AUTOLOAD
for non-methods from a base class named
BaseClass
, execute *AUTOLOAD = \&BaseClass::AUTOLOAD
during startup.
In code that currently says use AutoLoader; @ISA = qw(AutoLoader);
you should remove AutoLoader from @ISA
and change use AutoLoader;
to
use AutoLoader 'AUTOLOAD';
.
&
prefix, or using a package qualifier, e.g. &our()
, or Foo::our()
.
use re;
without any arguments. That isn't very useful.
$one, $two = 1, 2;
when you meant to say
($one, $two) = (1, 2);
Another common error is to use ordinary parentheses to construct a list reference when you should be using square or curly brackets, for example, if you say
$array = (1,2);
when you should have said
$array = [1,2];
The square brackets explicitly turn a list value into a scalar value, while parentheses do not. So when a parenthesized list is evaluated in a scalar context, the comma is treated like C's comma operator, which throws away the left argument, which is not what you want. See the perlref manpage for more on this.
tied
) was still valid when untie was called.
sub outermost { my $a; sub middle { sub { $a } } }
If the anonymous subroutine is called or referenced (directly or indirectly) from the outermost subroutine, it will share the variable as you would expect. But if the anonymous subroutine is called or referenced when the outermost subroutine is not active, it will see the value of the shared variable as it was before and during the *first* call to the outermost subroutine, which is probably not what you want.
In these circumstances, it is usually best to make the middle subroutine anonymous, using the sub {} syntax. Perl has specific support for shared variables in nested anonymous subroutines; a named subroutine in between interferes with this feature.
When the inner subroutine is called, it will probably see the value of the outer subroutine's variable as it was before and during the *first* call to the outer subroutine; in this case, after the first call to the outer subroutine is complete, the inner and outer subroutines will no longer share a common value for the variable. In other words, the variable will no longer be shared.
Furthermore, if the outer subroutine is anonymous and references a lexical variable outside itself, then the outer and inner subroutines will never share the given variable.
This problem can usually be solved by making the inner subroutine anonymous, using the sub {} syntax. When inner anonymous subs that reference variables in outer subroutines are called or referenced, they are automatically rebound to the current values of such variables.
perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LC_ALL = "En_US", LANG = (unset) are supported and installed on your system. perl: warning: Falling back to the standard locale ("C").
Exactly what were the failed locale settings varies. In the above the settings were that the LC_ALL was ``En_US'' and the LANG had no value. This error means that Perl detected that you and/or your system administrator have set up the so-called variable system but Perl could not use those settings. This was not dead serious, fortunately: there is a ``default locale'' called ``C'' that Perl can and will use, the script will be run. Before you really fix the problem, however, you will get the same error message each time you run Perl. How to really fix the problem can be found in the perllocale manpage section LOCALE PROBLEMS.
warn()
an empty string (the equivalent of
warn "") or you called it with no args and $_
was empty.
close()
done by an
open()
got an error indication on the
close().
This usually indicates your file system ran out of disk space.
rand + 5;
you may THINK you wrote the same thing as
rand() + 5;
but in actual fact, you got
rand(+5);
So put in parentheses to say what you really mean.
socket()
call? See
getsockopt.
open(OUT,">$ARGV[0]") or die "Can't write to $ARGV[0]: $!"; while (<STDIN>) { print; print OUT; } close OUT;
prefix1;prefix2
or
prefix1 prefix2
with nonempty prefix1 and prefix2. If prefix1
is indeed a prefix of a builtin library search path, prefix2 is substituted. The error may appear if components are not found, or are too long. See
``PERLLIB_PREFIX'' in
README.os2.
sh
-shell in. See
``PERL_SH_DIR'' in README.os2.
*nix
applications die in silence. It is considered a feature of the
OS/2 port. One can easily disable this by appropriate sighandlers, see
Signals. See also ``Process terminated by
SIGTERM/SIGINT'' in README.os2.