—#!/usr/bin/perl -w
=pod
=head1 NAME
psize - report memory usage for Perl structures
=head1 SYNOPSYS
psize 'Structure as perl code' ['options as string in hash form']
psize '[1, 2, { a => "foo" }'
psize 'Math::BigInt->new(123)' 't => "Total"'
Valid options are:
Boolean options:
Short name Long name Description
a addr print addresses
c class print class names
d doubles extensive cycle detection
(memory intensive)
t total print a total
o overhead print overhead
h head print a header
s summary print a summary
te terse generate terse report
String options:
i indent string to indent with
l left very first indent string
b bytes The string for sizes,
defaults to "bytes"
};
=head1 DESCRIPTION
=cut
use
strict;
if
(
@ARGV
== 0)
{
# no options?
Pod::Usage::pod2usage(2);
}
my
$token
=
shift
||
'"A scalar"'
;
my
$options
=
shift
|| {};
eval
(
" \$options = { $options }"
)
if
!
ref
$options
;
my
$map
= {
a
=>
'addr'
,
b
=>
'bytes'
,
c
=>
'class'
,
d
=>
'doubles'
,
t
=>
'total'
,
o
=>
'overhead'
,
i
=>
'indend'
,
l
=>
'left'
,
h
=>
'head'
,
s
=>
'summary'
,
te
=>
'terse'
,
};
# map 'a' => 'addr'
my
$opt
= {};
foreach
my
$key
(
keys
%$options
)
{
my
$m
=
$key
;
$m
=
$map
->{
$key
}
if
exists
$map
->{
$key
};
$opt
->{
$m
} =
$options
->{
$key
};
}
$opt
->{head} =
"Size report v$Devel::Size::Report::VERSION for '$token' =>"
;
my
$eval
=
$token
;
# make "Foo->new(1)" => "use Foo; Foo->new(1)"
$eval
=
"use $1; $token"
if
$token
=~ /^\s*([\w:]+)->/;
report_size (
eval
$eval
,
$opt
);