I came across a strange problem earlier today: when switching to a new filehandle with select(), sometimes output will go to the new filehandle before it goes to the old one. Here is some relevant code to help explain:
# Create the TEE filehandle, which will print to both STDOUT and to a
+file
open (TEE, "| tee $name") or die "Teeing off: $!\n";
select(TEE); # Now print goes to the TEE handle by default
$| = 1; # unbuffer TEE
my $stmt = $dbh->prepare("$sql") or die $DBI::errstr; # $sql takes 30-
+40 secs. to run
$stmt->execute() or die $DBI::errstr;
while (my @array = $stmt->fetchrow()) {
print;
}
$stmt->finish();
select(STDOUT);
&printfooter(); # prints a here-doc, about 10 lines
close(STDOUT) or die "Error closing: $!\n";
The SQL query that gets printed to the TEE filehandle is pretty huge - it generally takes 35-40 seconds for that block to execute, according to a benchmark. And, it doesn't seem to matter whether the filehandle is buffered. So, can anyone explain
why this is happening?