in reply to The trap of reference numification
Well, quick and dirty, and at the cost of a performance hit everywhere, you could overload numification etc. in UNIVERSAL to carp about it:
WarnOver.pm
package WarnOver; use strict; use warnings; package UNIVERSAL; use Scalar::Util 'refaddr'; use Carp; use overload q{0+} => sub { carp "numifying reference " . overload::StrVal($_[0]); refaddr $_[0]; }, q{""} => sub { carp "stringifying reference " . overload::StrVal($_[0]); overload::StrVal($_[0]); }, fallback => 1; ; 1;
test_warnover.pl
use strict; use warnings; use lib "."; use WarnOver; my $foo = bless {}, "Foo"; $\="\n"; print $foo % 2; print "$foo";
Result
numifying reference Foo=HASH(0x225118) at checkwarn.pl line 10 0 stringifying reference Foo=HASH(0x225118) at checkwarn.pl line 11 Foo=HASH(0x225118)
Update: This was just a quick thought exercise in evil overloading. It of course breaks horribly for object comparisions, as discussed above.
package Foo; use WarnOver; $foo = bless {}; $bar = bless {}; print "equal" if $foo == $bar; # two warnings!
-xdg
Code written by xdg and posted on PerlMonks is public domain. It is provided as is with no warranties, express or implied, of any kind. Posted code may not have been tested. Use of posted code is at your own risk.
|
|---|