Subject: | $^W is set globally by using this module (->Perl::Critic->Perl::Tidy) |
Because Perl::Tidy (now a required dependency of Perl::Critic) does a:
BEGIN { $^W = 1; }
when it is loaded, all code run during testing has this flag set, unless
explicitly overridden. Being used to using lexical warnings in the
modern style and moving away from the -w flag, I was surprised when an
XS module I was using (Unicode::String) began emitting warnings which
could NOT be turned off with 'no warnings'.
I am reporting this here, rather than Perl::Critic or Perl::Tidy because
that kind of makes sense (though I don't really know why?) in the usual
context those modules are used -- though it doesn't seem to be
documented. For Test::Perl::Critic, however, this is a lovely case of
action-at-a-distance.
The attached test shows how it fails. Substituting the following block
makes it work:
# Do this instead of 'use Test::Perl::Critic' to pass the test:
BEGIN {
local $^W;
require Test::Perl::Critic;
Test::Perl::Critic->import();
}
Perhaps you can do something similar when you load Perl::Tidy?
I've tested this on perl 5.8.7 and 5.12.3.
I guess you could consider this a work-around for the 'perl -w' bug ;-)
Subject: | test_warn_flag.t |
#!/usr/bin/perl
BEGIN { $^W = 0; }
use Test::Perl::Critic; # Who knew this would set $^W ??
# Do this instead to pass the test:
# BEGIN {
# local $^W;
# require Test::Perl::Critic;
# Test::Perl::Critic->import();
# }
use warnings;
warn join "\n ",
"\nThese Perl::* modules are loaded", grep( {/Perl.*Tidy/} keys %INC ), "";
use Test::More tests => 1;
is $^W, 0, 'Surprise';