sub input { my ( $c) = @_; ...; @_ = ($value ); goto(&$c); } sub process1 { my ($input, $c) = @_; ...; @_ = ($result); goto(&$c); } sub process2 { my ($input, $c) = @_; ...; @_ = ($result); goto(&$c); } sub output { my ($result ) = @_; ...; } input( sub { process1(@_, sub { process2(@_, \&output ) } ) } );