=head1 NAME
+X<warning, lexical> X<warnings> X<warning>
perllexwarn - Perl Lexical Warnings
All warnings are enabled in a block by either of these:
- use warnings ;
- use warnings 'all' ;
+ use warnings;
+ use warnings 'all';
Similarly all warnings are disabled in a block by either of these:
- no warnings ;
- no warnings 'all' ;
+ no warnings;
+ no warnings 'all';
For example, consider the code below:
- use warnings ;
- my @a ;
+ use warnings;
+ my @a;
{
- no warnings ;
- my $b = @a[0] ;
+ no warnings;
+ my $b = @a[0];
}
my $c = @a[0];
be reported for the C<$a> variable.
my $a = "2:" + 3;
- no warnings ;
+ no warnings;
my $b = "2:" + 3;
Note that neither the B<-w> flag or the C<$^W> can be used to
a block of code. You might expect this to be enough to do the trick:
{
- local ($^W) = 0 ;
- my $a =+ 2 ;
- my $b ; chop $b ;
+ local ($^W) = 0;
+ my $a =+ 2;
+ my $b; chop $b;
}
When this code is run with the B<-w> flag, a warning will be produced
{
BEGIN { $^W = 0 }
- my $a =+ 2 ;
- my $b ; chop $b ;
+ my $a =+ 2;
+ my $b; chop $b;
}
The other big problem with C<$^W> is the way you can inadvertently
sub doit
{
- my $b ; chop $b ;
+ my $b; chop $b;
}
- doit() ;
+ doit();
{
- local ($^W) = 1 ;
+ local ($^W) = 1;
doit()
}
=over 5
=item B<-w>
+X<-w>
This is the existing flag. If the lexical warnings pragma is B<not>
used in any of you code, or any of the modules that you use, this flag
details of how this flag interacts with lexical warnings.
=item B<-W>
+X<-W>
If the B<-W> flag is used on the command line, it will enable all warnings
throughout the program regardless of whether warnings were disabled
Think of it as the Perl equivalent of the "lint" command.
=item B<-X>
+X<-X>
Does the exact opposite to the B<-W> flag, i.e. it disables all warnings.
code (using a C<local $^W=0>) if it really wants to, but not vice-versa.
=head2 Category Hierarchy
+X<warning, categories>
A hierarchy of "categories" have been defined to allow groups of warnings
to be enabled/disabled in isolation.
Just like the "strict" pragma any of these categories can be combined
- use warnings qw(void redefine) ;
- no warnings qw(io syntax untie) ;
+ use warnings qw(void redefine);
+ no warnings qw(io syntax untie);
Also like the "strict" pragma, if there is more than one instance of the
C<warnings> pragma in a given scope the cumulative effect is additive.
- use warnings qw(void) ; # only "void" warnings enabled
+ use warnings qw(void); # only "void" warnings enabled
...
- use warnings qw(io) ; # only "void" & "io" warnings enabled
+ use warnings qw(io); # only "void" & "io" warnings enabled
...
- no warnings qw(void) ; # only "io" warnings enabled
+ no warnings qw(void); # only "io" warnings enabled
To determine which category a specific warning has been assigned to see
L<perldiag>.
=head2 Fatal Warnings
+X<warning, fatal>
The presence of the word "FATAL" in the category list will escalate any
warnings detected from the categories specified in the lexical scope
and C<join> can all produce a C<"Useless use of xxx in void context">
warning.
- use warnings ;
+ use warnings;
- time ;
+ time;
{
- use warnings FATAL => qw(void) ;
- length "abc" ;
+ use warnings FATAL => qw(void);
+ length "abc";
}
- join "", 1,2,3 ;
+ join "", 1,2,3;
- print "done\n" ;
+ print "done\n";
When run it produces this output
use warnings FATAL => 'all', NONFATAL => 'syntax';
=head2 Reporting Warnings from a Module
+X<warning, reporting> X<warning, registering>
The C<warnings> pragma provides a number of functions that are useful for
module authors. These are used when you want to report a module-specific
use warnings::register;
sub open {
- my $path = shift ;
+ my $path = shift;
if ($path !~ m#^/#) {
warnings::warn("changing relative path to /var/abc")
if warnings::enabled();
}
}
- 1 ;
+ 1;
The call to C<warnings::register> will create a new warnings category
called "MyMod::abc", i.e. the new category name matches the current
sub open {
warnings::warnif("deprecated",
- "open is deprecated, use new instead") ;
- new(@_) ;
+ "open is deprecated, use new instead");
+ new(@_);
}
sub new
...
- 1 ;
+ 1;
The function C<open> has been deprecated, so code has been included to
display a warning message whenever the calling module has (at least) the
use warnings 'deprecated';
use MyMod::Abc;
...
- MyMod::Abc::open($filename) ;
+ MyMod::Abc::open($filename);
Either the C<warnings::warn> or C<warnings::warnif> function should be
used to actually display the warnings message. This is because they can
Consider this example:
- package Original ;
+ package Original;
- no warnings ;
- use warnings::register ;
+ no warnings;
+ use warnings::register;
sub new
{
- my $class = shift ;
- bless [], $class ;
+ my $class = shift;
+ bless [], $class;
}
sub check
{
- my $self = shift ;
- my $value = shift ;
+ my $self = shift;
+ my $value = shift;
if ($value % 2 && warnings::enabled($self))
{ warnings::warn($self, "Odd numbers are unsafe") }
sub doit
{
- my $self = shift ;
- my $value = shift ;
- $self->check($value) ;
+ my $self = shift;
+ my $value = shift;
+ $self->check($value);
# ...
}
- 1 ;
+ 1;
- package Derived ;
+ package Derived;
- use warnings::register ;
- use Original ;
- our @ISA = qw( Original ) ;
+ use warnings::register;
+ use Original;
+ our @ISA = qw( Original );
sub new
{
- my $class = shift ;
- bless [], $class ;
+ my $class = shift;
+ bless [], $class;
}
- 1 ;
+ 1;
The code below makes use of both modules, but it only enables warnings from
C<Derived>.
- use Original ;
- use Derived ;
+ use Original;
+ use Derived;
use warnings 'Derived';
- my $a = new Original ;
- $a->doit(1) ;
- my $b = new Derived ;
- $a->doit(1) ;
+ my $a = Original->new();
+ $a->doit(1);
+ my $b = Derived->new();
+ $a->doit(1);
When this code is run only the C<Derived> object, C<$b>, will generate
a warning.