Why are use warnings; use strict; not default in Perl?

Well, use strict is default now, sort of.

Since Perl 5.12.0 if you require a version of Perl >= 5.12.0, then your script will have all the backwards incompatible features turned on, including strict by default.

use 5.12.0;
use warnings;

Is the same as:

use strict;
use warnings;
use feature ':5.12';

It hasn't been turned on more broadly because doing so would break a lot scripts that people depend on to "just work".

Moose also automatically turns on strict and warnings when you use it. So if you do any Moose based Perl OOP, then you get a free pass here, too.


If you are on a modern Perl, say so, you just have to enable it. 5.12 applies strict except for one-liners. It can't be default because of backward compatibility.

$ cat strict-safe?.pl
use 5.012;
$foo

$ perl strict-safe\?.pl 
Global symbol "$foo" requires explicit package name at strict-safe?.pl line 2.
Execution of strict-safe?.pl aborted due to compilation errors.

It's for backwards compatibility. Perl 4 didn't have strict at all, and there are most likely still scripts out there originally written for Perl 4 that still work fine with Perl 5. Making strict automatic would break those scripts. The situation is even worse for one-liners, many of which don't bother to declare variables. Making one-liners strict by default would break probably millions of shell scripts and Makefiles out there.

It can't be loaded automagically, because it adds restrictions, not features. It's one thing to load IO::File when a method is called on a filehandle. But activating strict unless the code did something prohibited by strict is meaningless.

If a script specifies a minimum version of 5.11.0 or higher (e.g. use 5.012), then strict is turned on automatically. This doesn't enable warnings, but perhaps that will be added in a future version. Also, if you do OO programming in Perl, you should know that using Moose automatically turns on both strict and warnings in that class.


It's a philosophical question, not a "it won't work" question.

First, perl has always been under the "you can do it incorrectly if you want" type of paradigm. Which is why there are a lot of perl haters out there. Many would prefer that the language always force you to write good code, but many quick-script-hackers don't want to. Consider:

perl -e '@a = split(/[,:]/, $_); print $a[1],"\n";'

Now, it would be easy to add a 'my' in front of the @a, but for a one line, one-time script people don't want to do that.

Second, yes, I think most of CPAN would indeed need to be rewritten.

There isn't a good answer you'll like, I'm afraid.

Tags:

Perl