1 |
=head1 NAME |
2 |
|
3 |
common::sense - save a tree AND a kitten, use common::sense! |
4 |
|
5 |
=head1 SYNOPSIS |
6 |
|
7 |
use common::sense; |
8 |
|
9 |
# roughly the same as, with much lower memory usage: |
10 |
# |
11 |
# use strict qw(vars subs); |
12 |
# use feature qw(say state switch); |
13 |
# no warnings; |
14 |
|
15 |
=head1 DESCRIPTION |
16 |
|
17 |
This module implements some sane defaults for Perl programs, as defined by |
18 |
two typical (or not so typical - use your common sense) specimens of |
19 |
Perl coders. |
20 |
|
21 |
=over 4 |
22 |
|
23 |
=item use strict qw(subs vars) |
24 |
|
25 |
Using C<use strict> is definitely common sense, but C<use strict |
26 |
'refs'> definitely overshoots it's usefulness. After almost two |
27 |
decades of Perl hacking, we decided that it does more harm than being |
28 |
useful. Specifically, constructs like these: |
29 |
|
30 |
@{ $var->[0] } |
31 |
|
32 |
Must be written like this, when C<use strict 'refs'> is in scope, and |
33 |
C<$var> can legally be C<undef>: |
34 |
|
35 |
@{ $var->[0] || [] } |
36 |
|
37 |
This is annoying, and doesn't shield against obvious mistakes such as |
38 |
using C<"">, so one would even have to write: |
39 |
|
40 |
@{ defined $var->[0] ? $var->[0] : [] } |
41 |
|
42 |
... which nobody with a bit of common sense would consider |
43 |
writing. Curiously enough, sometimes, perl is not so strict, as this works |
44 |
even with C<use strict> in scope: |
45 |
|
46 |
for (@{ $var->[0] }) { ... |
47 |
|
48 |
If that isnt hipocrasy! And all that from a mere program! |
49 |
|
50 |
=item use feature qw(say state given) |
51 |
|
52 |
We found it annoying that we always have to enable extra features. If |
53 |
something breaks because it didn't anticipate future changes, so be |
54 |
it. 5.10 broke almost all our XS modules and nobody cared either - and few |
55 |
modules that are no longer maintained work with newer versions of Perl, |
56 |
regardless of use feature. |
57 |
|
58 |
If your code isn'talive, it's dead, jim. |
59 |
|
60 |
=item no warnings |
61 |
|
62 |
The dreaded warnings. Even worse, the horribly dreaded C<-w> switch. Even |
63 |
though we don't care if other people use warnings (and certainly there are |
64 |
useful ones), a lot of warnings simply go against the spirit of Perl, most |
65 |
prominently, the warnings related to C<undef>. There is nothing wrong with |
66 |
C<undef>: it has well-defined semantics, it is useful, and spitting out |
67 |
warnings you never asked for is just evil. |
68 |
|
69 |
So every module needs C<no warnings> to avoid somebody accidentally using |
70 |
C<-w> and forcing his bad standards on our code. No will do. |
71 |
|
72 |
(Also, why isn't this a C<use feature> switch? Adding warnings is |
73 |
apparently considered O.K., even if it breaks your programs). |
74 |
|
75 |
=item much less memory |
76 |
|
77 |
Just using all those pragmas together waste <blink>I<< B<776> kilobytes |
78 |
|
79 |
>></blink> of precious memory in my perl, for I<every single perl process |
80 |
|
81 |
using our code>, which on our machines, is a lot. In comparison, this |
82 |
module only uses I<< B<four> >> kilobytes (I even had to write it out so |
83 |
it looks like more) of memory on the same platform. |
84 |
|
85 |
The money/time/effort/electricity invested in these gigabytes (probably |
86 |
petabytes globally!) of wasted memory could easily save 42 trees, and a |
87 |
kitten! |
88 |
|
89 |
=cut |
90 |
|
91 |
package common::sense; |
92 |
|
93 |
our $VERSION = '0.03'; |
94 |
|
95 |
sub import { |
96 |
# no warnings |
97 |
${^WARNING_BITS} ^= ${^WARNING_BITS}; |
98 |
|
99 |
# use strict vars subs |
100 |
$^H |= 0x00000600; |
101 |
|
102 |
# use feature |
103 |
$^H{feature_switch} = |
104 |
$^H{feature_say} = |
105 |
$^H{feature_state} = 1; |
106 |
} |
107 |
|
108 |
=cut |
109 |
|
110 |
1; |
111 |
|
112 |
=back |
113 |
|
114 |
=head1 AUTHOR |
115 |
|
116 |
Marc Lehmann <schmorp@schmorp.de> |
117 |
http://home.schmorp.de/ |
118 |
|
119 |
=cut |
120 |
|