use diagnostic; or use splain

diagnostics splain

If you get a warning or error from Perl that you don't understand you have several choices:

Beyond the short error message or warning you get from perl, you can also ask perl to provide you a long explanation. You can do this either by adding use diagnostics; to your code (recommended only during development), or by saving the error message in a file and then using splain.

Illegal division by zero

Let's use a trivial example:

$x = 0;
print 1 / $x;

If we have the above code (though you should always use strict and warnings too) in a file called x.pl and we run it using perl x.pl we get the error:

Illegal division by zero at x.pl line 2.

I know. This error is probably obvious to most people familiar with basic math and when you encounter such error, the main issue is probably how did 0 end up in denominator, in our case in $x?

Nevertheless it is a good example to show how to get more detailed explanation:

use diagnostics

Add use diagnostics to the code:

use diagnostics;

$x = 0;
print 1 / $x;

run as perl x.pl

The output looks like this:

Illegal division by zero at x.pl line 4 (#1)
    (F) You tried to divide a number by 0.  Either something was wrong in
    your logic, or you need to put a conditional in to guard against
    meaningless input.

Uncaught exception from user code:
    Illegal division by zero at x.pl line 4.

splain

Splain is a command-line tool that comes with the standard installation of Perl.

We run the original script (without adding use diagnostics but we redirect the standard error to a file:

perl x.pl 2> x.err

The we run:

splain x.err

It will print

Illegal division by zero at x.pl line 2 (#1)
    (F) You tried to divide a number by 0.  Either something was wrong in
    your logic, or you need to put a conditional in to guard against
    meaningless input.

splain in a pipe

The more adventurous Linux/Unix user can also pipe the error message through splain without saving it in a file using

perl x.pl 2>&1 | splain

Other pages

use strict; and warnings; but no diagnostics
use strict; and warnings; but no diagnostics
Safety net (use strict; use warnings;) - video
Length of an array in Perl
How to get a slice of an array or an array reference?
Common Warnings and Error messages in Perl
Always use strict and use warnings in your perl code!
Always use strict and use warnings in your perl code!
Advanced Perl Maven video course

Author

Gabor Szabo (szabgab) Gabor Szabo