iza has asked for the wisdom of the Perl Monks concerning the following question:

hi :)

my code is
open STDOUT, ">$file" || die "Cannot open file $file : $!"; system "diff $old_file $file"; select(STDOUT); # Restore default print to STDOUT close(STDOUT);
but the default print is never ever restored to stdout (i mean, as long as the program runs !)
i don't know how to restore defaut print ... can anyone help ??

Replies are listed 'Best First'.
(jeffa) Re: stdout back to the normal ??
by jeffa (Bishop) on Nov 13, 2001 at 22:55 UTC
    Hi, this is straight from Dr. Stein's excellent Network Programming in Perl book:
    print "redirecting STDOUT\n"; open (SAVEOUT, ">&STDOUT"); open (STDOUT, ">$file") or die "Can't open $file: $!"; #STDOUT is now redirected system "diff $old_file $file"; open (STDOUT, ">&SAVEOUT"); print "STDOUT is back to normal!\n";

    jeffa

    L-LL-L--L-LL-L--L-LL-L--
    -R--R-RR-R--R-RR-R--R-RR
    F--F--F--F--F--F--F--F--
    (the triplet paradiddle)
    
Re: stdout back to the normal ??
by davis (Vicar) on Nov 13, 2001 at 22:58 UTC
    Hi, I think the problem is the open STDOUT. You're redirecting the output of STDOUT to $file, and in fact the select(STDOUT) doesn't acheive anything, because the default output handle is already STDOUT.
    Another way around would be to open a read pipe from a system command, like this:
    #!/usr/bin/perl -w use strict; my $output = "out.txt"; open(OUT, ">$output") or die "Couldn't open $output: $!\n"; open(IN, "date|") or die "Couldn't open date|: $!\n"; print OUT <IN>; close(OUT); close(IN); print "This gets printed to stdout.\n";
    There are, of course, other ways to do it, but that's something for some more experienced monks to attempt :).
Re: stdout back to the normal ??
by chromatic (Archbishop) on Nov 16, 2001 at 00:28 UTC
    Is this better?
    { local *NEWOUT; open(NEWOUT, "> $file") or die "Cannot open ($file): $!"; my $oldfh = select(NEWOUT); # print some stuff here select($oldfh); }
    Of course, if you're going to run a system call, you might just use shell redirection to the file. There's more than one way to tame this camel. (Caveat added because I'm not sure redirecting STDOUT in a Perl parent will affect the non-Perl child.)