$ perl -E ' my @users = ( { audience => "Management" }, { audience => "Employee" }, { audience => "Guest" }, ); generate_report($_) for @users; sub generate_report { my ($user) = @_; say main_template() =~ s/__AUDIENCE__/$user->{audience}/r =~ s/__MNGT_REP__/mngt_rep($user)/er =~ s/__EMP_REP__/emp_rep($user)/er =~ s/__GUEST_REP__/guest_rep($user)/er; } # Theredocs (out of the way) sub main_template { < Report for __AUDIENCE__.

__MNGT_REP____EMP_REP____GUEST_REP__ EOF } sub mngt_rep { my ($viewer) = @_; return "" unless $viewer->{audience} eq "Management"; return < ... Management Report ... EOF } sub emp_rep { my ($viewer) = @_; return "" unless $viewer->{audience} eq "Employee"; return < ... Employee Report ... EOF } sub guest_rep { my ($viewer) = @_; return "" unless $viewer->{audience} eq "Guest"; return < ... Guest Report ... EOF } '