our
@EXPORT
=
'dumper'
;
sub
dumper {
my
$val
=
shift
;
return
_dump(
$val
, {} );
}
sub
_dump {
my
$val
=
shift
;
my
$seen
=
shift
;
return
'<NULL>'
unless
defined
$val
;
return
$val
unless
ref
(
$val
);
return
'<LOOP>'
if
$seen
->{
$val
};
$seen
->{
$val
} = 1
if
ref
$val
;
if
(
ref
(
$val
) &&
$val
=~
'SCALAR'
){
return
'<REF>'
.
$$val
;
}
if
(
ref
(
$val
) &&
$val
=~
'HASH'
){
return
'{}'
unless
keys
%$val
;
my
$out
=
"{\n"
;
my
$maxl
= 0;
$maxl
= (
length
(
$_
) >
$maxl
) ?
length
(
$_
) :
$maxl
for
keys
%$val
;
for
my
$k
(
sort
keys
%$val
){
my
$v
= _dump(
$val
->{
$k
},
$seen
);
$v
=~ s/\n(.)/\n $1/gm;
$out
.=
sprintf
" %-${maxl}s => %s\n"
,
$k
,
$v
;
}
$out
.=
"}"
;
return
$out
;
}
if
(
ref
(
$val
) &&
$val
=~
'ARRAY'
){
return
'[]'
unless
@$val
;
my
$out
=
"[\n"
;
for
my
$k
(
@$val
){
my
$v
= _dump(
$k
,
$seen
);
$v
=~ s/^/ /gm;
$out
.=
$v
.
"\n"
;
}
$out
.=
"]"
;
return
$out
;
}
return
"<$val>"
;
}
1;