MidLifeXis has asked for the wisdom of the Perl Monks concerning the following question:

Is this a reasonable approach to injecting a check into the "warn" call to remove certain warnings from your error stream? I would like to fix the warnings, but this is from 3rd party code, so the best I can do without rewriting their code (and introducing that mess) is to filter the errors out.

I don't want to filter all of these warnings out, just the ones from Foo::Bar.

#!perl -w ... use Foo::Bar; ... { my $lastwarn = $SIG{__WARN__}; # Filter out garbage warnings $SIG{__WARN__} = sub { return if ($_[0] =~ m/Use of uninitialized value in subroutine.*Foo +\/Bar.*/); (defined($lastwarn) && $lastwarn) ? &$lastwarn(@_) : warn(@_); }; }

Thanks all.

Update: Fixed error in regex.

Update 2: It appears (silly me) that the -w in the shebang line has implications (like making warnings global, for instance). I guess this is one of those "looking at the problem too long" type solutions (thanks tye).

--MidLifeXis

Replies are listed 'Best First'.
Re: Injecting a filter into warn()
by eyepopslikeamosquito (Archbishop) on Mar 10, 2005 at 21:10 UTC

    How about inserting the line:

    no warnings 'uninitialized';
    inside the offending module?

    If you're worried about tracking changes to third party code, a simple (primitive) solution is to use a unique string to identify your changes, for example:

    no warnings 'uninitialized'; ### __MidLifeXis__

      I thought of that, but did not want to remove all warnings of that type. Just the ones from the third party module.

      tye hit the nail on the head (in the cb) - I had a -w in my shebang line.

      Update: Clarified wording slightly.

      --MidLifeXis

        I thought of that, but did not want to remove all warnings of that type. Just the ones from the third party module.
        But if you insert the line inside the module, it only applies to that module. Generally, the warnings pragma is limited to the enclosing block -- so you could even apply it selectively to functions or blocks of the offending module if you wished.

        Don't get me wrong, I agree switching off the -w in the shebang line seems the best solution.

        You could use warnings instead of using -w. -w affects all lines processed by perl, no matter which module its parsing at the moment. use warnings only affects the module (or block) in which its located.
Re: Injecting a filter into warn()
by MidLifeXis (Monsignor) on Mar 14, 2005 at 18:05 UTC

    After looking at the most recent responses and thinking "Hmm, I thought we already implicated -w as the culprit. Why are these comments repeating stuff...", I realized that I had discussed this in CB, and did not update this conversation with the resolution.

    Yes, -w was causing problems. It was a cargo cultism, brought forward in a local code template (written by me, no less), the content of the static parts which has been mostly ignored since originally authored. Once the -w was removed from the shebang line, all is well with the world, warning scope is proper, birds are singing...

    In all, thanks everyone for your help.

    --MidLifeXis