sub foo { if ( 1 ) { ONCE(); # This block is run only once, ever. } } use Devel::Caller 'caller_cv'; use B 'svrev_2object'; use B::Utils qw( walkoptree_filtered opgrep ); use B::Generate (); sub ONCE { walkoptree_filtered svref_2object( caller_cv 1 )->ROOT, \ &find_ENTERSUB, \ &removE_ONCE; } sub remove_once { # Remove the parent of this op from execution. my $op = shift; my $parent = $op->parent; # This ignores other nodes which might point to this one using ->other(). $parent->previous->next( $parent->next ); # Remove $parent from the family tree. my $grandma = $parent->parent; if ( ${$grandma->first} == $$parent ) { $grandma->first( $parent->sibling ); } else { for my $aunt ( $grandma->kids ) { if ( ${$aunt->sibling} == $$parent ) { $aunt->sibling( $parent->sibling ); last; } } } } sub find_ENTERSUB { # I have no idea if this is the *right* ONCE() to remove. my $op = shift; # perl -MO=Concise -e "foo()" # (entersub # (pushmark # (ex-list # (pushmark) # (gv "foo")))) opgrep { name => 'entersub', first => { first => { sibling => { first => { PV => 'foo' } } } } }, $op; }