*import
= \
&Exporter::import
;
our
@EXPORT
=
qw(stdump)
;
my
%dump
= (
'SCALAR'
=> \
&dump_scalar
,
'LVALUE'
=> \
&dump_scalar
,
'ARRAY'
=> \
&dump_array
,
'HASH'
=> \
&dump_hash
,
'REF'
=> \
&dump_ref
,
);
sub
stdump {
my
(
$object
) =
@_
;
croak
"Not a reference!"
unless
ref
(
$object
);
my
$ctx
= {
dumped
=> {},
object
=> {},
count
=> 0,
dump
=>
''
,
};
recursive_dump(
$object
, 1,
$ctx
);
return
$ctx
->{
dump
};
}
sub
recursive_dump {
my
(
$object
,
$link
,
$ctx
) =
@_
;
my
$what
=
"$object"
;
my
(
$bless
,
$ref
,
$addr
) =
$what
=~ /^(\w+)=(\w+)\((0x.*)\)$/;
(
$ref
,
$addr
) =
$what
=~ /^(\w+)\((0x.*)\)$/
unless
$bless
;
$ref
=
'REF'
if
ref
(
$object
) eq
'REF'
;
if
(
$link
&&
$ctx
->{dumped}{
$addr
}++) {
my
$num
=
$ctx
->{object}{
$addr
};
$ctx
->{
dump
} .=
"OBJECT #$num seen\n"
;
return
;
}
my
$objcount
=
$ctx
->{count}++;
$ctx
->{object}{
$addr
} =
$objcount
;
croak
"Unknown simple type '$ref'"
unless
defined
$dump
{
$ref
};
$dump
{
$ref
}->(
$object
,
$ctx
);
$ctx
->{
dump
} .=
"BLESS $bless\n"
if
$bless
;
$ctx
->{
dump
} .=
"OBJECT $objcount\n"
;
}
sub
dump_scalar {
my
(
$sref
,
$ctx
) =
@_
;
my
$scalar
=
$$sref
;
unless
(
defined
$scalar
) {
$ctx
->{
dump
} .=
"UNDEF\n"
;
return
;
}
my
$len
=
length
(
$scalar
);
$ctx
->{
dump
} .=
"SCALAR len=$len $scalar\n"
;
}
sub
dump_array {
my
(
$aref
,
$ctx
) =
@_
;
my
$items
= 0 + @{
$aref
};
$ctx
->{
dump
} .=
"ARRAY items=$items\n"
;
foreach
my
$item
(@{
$aref
}) {
unless
(
defined
$item
) {
$ctx
->{
dump
} .=
'ITEM_UNDEF'
.
"\n"
;
next
;
}
$ctx
->{
dump
} .=
'ITEM '
;
recursive_dump(\
$item
, 1,
$ctx
);
}
}
sub
dump_hash {
my
(
$href
,
$ctx
) =
@_
;
my
$items
=
scalar
(
keys
%{
$href
});
$ctx
->{
dump
} .=
"HASH items=$items\n"
;
foreach
my
$key
(
sort
keys
%{
$href
}) {
$ctx
->{
dump
} .=
'KEY '
;
recursive_dump(\
$key
,
undef
,
$ctx
);
unless
(
defined
$href
->{
$key
}) {
$ctx
->{
dump
} .=
'VALUE_UNDEF'
.
"\n"
;
next
;
}
$ctx
->{
dump
} .=
'VALUE '
;
recursive_dump(\
$href
->{
$key
}, 1,
$ctx
);
}
}
sub
dump_ref {
my
(
$rref
,
$ctx
) =
@_
;
my
$deref
=
$$rref
;
$ctx
->{
dump
} .=
'REF '
;
recursive_dump(
$deref
, 1,
$ctx
);
}
1;