in reply to Re^3: A Scalar::Util::refaddr Oddity
in thread A Scalar::Util::refaddr Oddity
Because that idiom fails if $object overloads addition to do something else.
Doh! (Can you tell I don't mess with overloading much? Wasn't even on my radar screen.) OK, then, quick perusal of overload reveals the StrVal function, which can get us back to the original "grab the right substring and convert" approach without the reblessing.
use strict; use warnings; use Scalar::Util qw( refaddr ); package Foo; use overload '0+' => sub { 0 }, q{""} => sub { "Some Object" }, fallback => 1; package main; use overload; sub refaddr_pp { return if not ref $_[0]; overload::StrVal($_[0]) =~ /0x(\w+)/; return hex $1; } my $obj = bless {}, 'Foo'; my $ref = {}; print 'stringify $obj: ', "$obj", "\n"; print 'refaddr $obj: ', refaddr($obj), "\n"; print 'refaddr_pp $obj: ', refaddr_pp($obj), "\n\n"; print 'stringify $ref: ', "$ref", "\n"; print 'refaddr $ref: ', refaddr($ref), "\n"; print 'refaddr_pp $ref: ', refaddr_pp($ref), "\n\n";
Prints
stringify $obj: Some Object refaddr $obj: 155892768 refaddr_pp $obj: 155892768 stringify $ref: HASH(0x94abd10) refaddr $ref: 155893008 refaddr_pp $ref: 155893008
-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.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^5: A Scalar::Util::refaddr Oddity
by adrianh (Chancellor) on Sep 26, 2005 at 16:04 UTC | |
by xdg (Monsignor) on Sep 26, 2005 at 17:26 UTC | |
by adrianh (Chancellor) on Sep 27, 2005 at 13:08 UTC | |
by xdg (Monsignor) on Sep 27, 2005 at 15:43 UTC | |
|
Re^5: A Scalar::Util::refaddr Oddity
by hv (Prior) on Sep 27, 2005 at 16:23 UTC |