Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight
 
PerlMonks  

Re: How to modify a warning message within a sub?

by shmem (Canon)
on Aug 09, 2011 at 02:45 UTC ( #919364=note: print w/replies, xml ) Need Help??


in reply to How to modify a warning message within a sub?

I read about installing a __WARN__ signal handler, but that appears to require exposing $arrayRef to a wider scope.

No. Did you try? The trick is to install a local $SIG{__WARN__}:

sub compareLT105 { my $arrayRef = shift; { # bare block to narrow scope of local() local $SIG{__WARN__} = sub { chomp( my $msg = $_[0] ); print STDERR $msg," \$arrayRef = [qw(@{$arrayRef})]\n"; }; return 'true' if $arrayRef->[1] < 105; } return 'false'; } For 100 compareLT105 says: true For 106 compareLT105 says: false Argument "100A" isn't numeric in numeric lt (<) at warn.pl line 27. $a +rrayRef = [qw(3 100A)] For 100A compareLT105 says: true Argument "100B2" isn't numeric in numeric lt (<) at warn.pl line 27. $ +arrayRef = [qw(4 100B2)] For 100B2 compareLT105 says: true

Replies are listed 'Best First'.
Re^2: How to modify a warning message within a sub?
by Marshall (Abbot) on Aug 09, 2011 at 03:53 UTC
    THANKS!, I worked some more...this works..
    The good thing is that $arrayRef->[1] works without having $arrayRef having more scope than within the sub{}.

    #!/usr/bin/perl -w use strict; $|=1; #turns off buffering for STDOUT my @x = ( [1,'100'], [2,'106'], [3,'100A'], [4,'100B2'], ); foreach my $ref (@x) { print "For $ref->[1] compareLT105 says: ", compareLT105($ref),"\n"; } sub compareLT105 { my $arrayRef = shift; local $SIG{__WARN__} = sub { my $msg = shift; print STDERR $msg,"********"; print STDERR "error array index: ",$arrayRef->[0]; print STDERR " value is ",$arrayRef->[1], "\n"; }; return 'true' if $arrayRef->[1] < 105; return 'false'; } __END__ For 100 compareLT105 says: true For 106 compareLT105 says: false Argument "100A" isn't numeric in numeric lt (<) at C:\TEMP\warnexample +.pl line 30. ********error array index: 3 value is 100A For 100A compareLT105 says: true Argument "100B2" isn't numeric in numeric lt (<) at C:\TEMP\warnexampl +e.pl line 30. ********error array index: 4 value is 100B2 For 100B2 compareLT105 says: true

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://919364]
help
Chatterbox?
[shmem]: some experience with vim?
[Lady_Aleena]: None
[shmem]: I don't know geany, and don't know whether it has support for ctags.
[Lady_Aleena]: ctags?
[shmem]: ctags is a program which (recursively) extracts the symbols from source and stores them in a one-file database. This allows you to query the locations where these symbols (e.g. a subroutine name) are used anywhere in the source code tree...
[shmem]: ...from inside the editor.
[shmem]: apt-get install exuberant-ctags
[Lady_Aleena]: I think I heard vim has a big learning curve.
[shmem]: then in the root of your source tree run: ctags -R
[shmem]: you get a file named tags where all symbols and the places where they are used are listed

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (9)
As of 2017-04-27 12:09 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    I'm a fool:











    Results (505 votes). Check out past polls.