I think that $SIG{'__WARN__'} is the wrong approach to this problem. The warning-generating condition can be detected before the warning occurs, so why not detect it yourself and handle it more cleanly than with an action-at-a-distance %SIG handler? Here are two methods that I frequently use:
  1. Warn and skip as soon as the line is known to be bad. In your case, do it when the URL RE fails. This method tends to be efficient, since any parsing code lower in the loop is bypassed on error. However, it only reports the first parse error for any particular line, and requires warn/skip code at each parse step that could fail.
  2. $entry[6] =~ m{^http://.*v1=(.*)&v2=(.*)&v3=.*$} or do { warn "Skipping unparseable line $. :\n" . " http_code: $http_code\n" . " url: $url\n" . " edate[0]: $edate[0]\n" . " edate[1]: $edate[1]\n" . " edate[2]: $edate[2]\n" . " edate[3]: $edate[3]\n" ; next; }; my $url = "$1$2"; $STATUS{$http_code}{$url}{$edate[0]}{$edate[1]}{$edate[2]}{$edate[3]}+ ++;
  3. When any element fails to parse, set it to undef. When the time comes to use those elements, then warn/skip if any of them are undefined. In your case, do it just before incrementing %STATUS. This method produces only one warning per line when multiple parse errors occur, and consolidates all the error handling (except setting undef) into one place.
  4. my $url = ( $entry[6] =~ m{^http://.*v1=(.*)&v2=(.*)&v3=.*$} ) ? "$1$2" : undef ; # ... More parsing code can go here. if ( grep {not defined $_} ( $http_code, $url, @edate[0..3] ) ) { warn "Skipping unparseable line $. :\n"; # ... and dump vars. next; } $STATUS{$http_code}{$url}{$edate[0]}{$edate[1]}{$edate[2]}{$edate[3]}+ ++;

In reply to Re: Catching Warnings and Showing Uninitialized Variables by Util
in thread Catching Warnings and Showing Uninitialized Variables by madbombX

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.