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
Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
Read Where should I post X? if you're not absolutely sure you're posting in the right place.
Please read these before you post! —
Posts may use any of the Perl Monks Approved HTML tags:
- a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
| |
For: |
|
Use: |
| & | | & |
| < | | < |
| > | | > |
| [ | | [ |
| ] | | ] |
Link using PerlMonks shortcuts! What shortcuts can I use for linking?
See Writeup Formatting Tips and other pages linked from there for more info.