in reply to how to control/redirect print()

Yes, you can redirect STDOUT to a variable. But you need some kind of statement to select between "normal STDOUT" and the "variable STDOUT". Another possibility is open a filehandle to a variable and just add that filehandle after the print's that you want to go there. And then just print that variable when you want that output to show up? Note: all I/O routines return status, including print - that's what causes this extra '1' to show up in the printout and it is the default return value from sample(), assuming the print succeeds which it almost always does.

I guess there are some other possibilities here, depending upon whether you are writing to a file or to something that Perl can identify as the console. STDERR is non-buffered while STDOUT is buffered when writing to pipes,files. STDERR will come out right NOW, vs STDOUT which will print when it's buffer is full, maybe 4-8K bytes or so.

#!/usr/bin/perl -w use strict; use 5.10.0; ## needed for "say" print "First, Order as written:\n"; my $str = q[new text]; $str .= sample( qw(1 2 3) ); #adds '1' to $str $str .= q[more new text]; print_now( "$str \n" ); sub sample { print q[sample(): ], @_, "\n"; } sub print_now { say @_; ## or # print $FH @_; # this an error what is $FH? } print "Now, reverse order:\n"; #################### my $delayedout; open (DELAY, '>', \$delayedout) or die "$!"; $str = q[new text]; $str .= sampleb( qw(1 2 3) ); $str .= q[more new text]; print_nowb( "$str \n" ); print $delayedout; sub sampleb { print DELAY q[sample(): ], @_, "\n"; } sub print_nowb { say @_; } __END__ PRINTS: First, Order as written: sample(): 123 new text1more new text # 1 is return value of sample # extra \n comes from say statement. Now, reverse order: new text1more new text sample(): 123