use B
qw(peekop class walkoptree walkoptree_exec walkoptree_slow
main_start main_root cstring svref_2object SVf_IVisUV);
use B
::Asmdata
qw(@specialsv_name);
my ($order, $cvref) = @_;
my $cv = svref_2object($cvref);
walkoptree_exec($cv->START, "terse");
walkoptree_slow($cv->ROOT, "terse");
my $order = @_ ? shift : "";
foreach $objname (@options) {
$objname = "main::$objname" unless $objname =~ /::/;
eval "terse(\$order, \\&$objname)";
die "terse($order, \\&$objname) failed: $@" if $@;
return sub { walkoptree_exec(main_start, "terse") }
return sub { walkoptree_slow(main_root, "terse") }
my $level = @_ ? shift : 0;
$targ = ($targ > 0) ? " [$targ]" : "";
print indent($level), peekop($op), $targ, "\n";
print indent($level), peekop($op), " ";
print indent($level), peekop($op), " ", $op->padix, "\n";
my $precomp = $op->precomp;
print indent($level), peekop($op),
defined($precomp) ? " /$precomp/\n" : " (regexp not compiled)\n";
print indent($level), peekop($op), " ", cstring($op->pv), "\n";
$label = " label ".cstring($label);
print indent($level), peekop($op), $label || "", "\n";
printf "%s (0x%lx) %s\n", class($sv), $$sv, cstring($sv->PV);
printf "%s (0x%lx) FILL %d\n", class($sv), $$sv, $sv->FILL;
my $stash = $gv->STASH->NAME;
printf "%s (0x%lx) *%s%s\n", class($gv), $$gv, $stash, $gv->SAFENAME;
my $v = $sv->FLAGS & SVf_IVisUV ? "%u" : "%d";
printf "%s (0x%lx) $v\n", class($sv), $$sv, $sv->int_value;
printf "%s (0x%lx) %s\n", class($sv), $$sv, $sv->NV;
printf "%s (0x%lx) %s\n", class($rv), $$rv, printref($rv);
my $rcl = class($rv->RV);
return "\\" . cstring($rv->RV->$rcl);
return "\\" . $rv->RV->$rcl;
return sprintf "\\%" . ($rv->RV->FLAGS & SVf_IVisUV ? "u" : "d"),
return "\\" . printref($rv->RV);
printf "%s (0x%lx)\n", class($sv), $$sv;
printf "%s #%d %s\n", class($sv), $$sv, $specialsv_name[$$sv];
B::Terse - Walk Perl syntax tree, printing terse info about ops
perl -MO=Terse[,OPTIONS] foo.pl
Malcolm Beattie, C<mbeattie@sable.ox.ac.uk>