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
|