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()
}
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>.
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::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.