From: Nick Ing-Simmons [mailto:[EMAIL PROTECTED]]
 
> Paul Marquess <[EMAIL PROTECTED]> writes:
> >Good catch Nick.
> >
> >Instead of completely backing out the "defined $str or return" change, if
> >you change it to
> >
> >   unless (defined $str) {
> >     warnif('uninitialized', 'Use of Uninitialized value in 
> encode_utf8');
> >     return;
> >   }
> >
> >that gives us the same warning behaviour as print/tr/etc, but more
> >importantly it also gives users of the module the ability to silence the
> >uninitalized warning in the same way they do with print/tr, thus:
> >
> >  use warnings;
> >  ...
> >  {
> >    no warnings 'uninitialized';
> >    Encode::encode_utf8($x);
> >  }
> 
> But surely the warning we get now is (as a core warning) already so 
> controlled ? 

The warning can be controlled if you place a "no warnings" in the scope where the 
warning is generated. In the case above, that is *inside* the encode_utf8 function.

The setting of the warnings pragma in the block that calls encode_utf8 function 
doesn't leak into the Encode function. 

That's where warnings::warnif comes in. It checks to see if the warning is enabled in 
the calling module. This allows module authors to give users of their module the 
control over what warnings are generated.

Without adding the warnif calls to the code, the only way you can silence the warning 
is 

  {
    local $^W = 0 ;
    Encode::encode_utf8($x);
  }

and that only works if the function being called isn't itself under the control of the 
warnings pragma. So for example

    sub xxx
    {
        use warnings ;
        my $a =~ tr/A/a/;
    }

    {
        local $^W = 0 ;
        xxx();
    }

still generates the "Use of uninitialized value" warning.

I see that Encode does make use of the warnings pragma in places, so I'm not sure if 
the "local $^W = 0" trick can be used with it.

> And can we not enhance the message generator to fish the name out 
> of somewhere so that is says "Use of undefined in subroutine encode_utf8"
> rather than just "subroutine entry" ? 

That would be worth doing regardless.

Paul

Reply via email to