my ($alpha, $beta); $alpha = $beta = << "EOF"; my $self = shift; ... foreach ... if ... if ... if ... push @foo, [ @bar ]; } } } else { push @foo, [ @bar ]; } } push @foo, [ @bar ]; return \@foo; END $beta =~ s/(push \@foo, \[ \@bar \]);/$1 if \$self->\{baz\} eq \$gamma;/gs; $beta =~ s/sub alpha/sub beta/; sub alpha { eval $alpha; } sub beta { eval $beta; EOF