in reply to Re^2: Can't close STDIN/STDOUT/STDERR
in thread Can't close STDIN/STDOUT/STDERR

I tried that (redirect to /dev/null) and it broke my program... I'm not well-versed enough in Perl to know why. Could you give me an example of how I should do it?

Replies are listed 'Best First'.
Re^4: Can't close STDIN/STDOUT/STDERR
by kennethk (Abbot) on Feb 09, 2010 at 21:31 UTC
    You can find samples of how to redirect file handles in open:

    open STDOUT, '>', "/dev/null" or die "Can't redirect STDOUT: $!";

Re^4: Can't close STDIN/STDOUT/STDERR
by ikegami (Patriarch) on Feb 09, 2010 at 21:33 UTC
    close(READER) or die "can't close READER: $!"; open STDIN, '<', '/dev/null' or die "can't open STDIN: $!\n"; open STDOUT, '>', '/dev/null' or die "can't open STDOUT: $!\n"; open STDERR, '>&', \*STDOUT' or die "can't dup STDOUT: $!\n";

      What does this syntax do:

      open STDERR, '>&', \*STDOUT'

      because this simpler syntax seems to work:

      1 use strict; 2 use warnings; 3 use 5.010; 4 5 open my $SAVE_STDOUT, '>&', 'STDOUT'; #<--quoted bareword 6 open STDOUT, '>', 'data1.txt'; 7 say 'hello world'; 8 9 open my $SAVE_STDERR, '>&', 'STDERR'; #<--quoted bareword 10 open STDERR, '>', 'errors.txt'; 11 warn "my warning message"; 12 13 open STDOUT, '>&', $SAVE_STDOUT; 14 open STDERR, '>&', $SAVE_STDERR; 15 say 'goodbye'; 16 warn 'my warning message #2'; --output:-- goodbye my warning message #2 at 2perl.pl line 16. $cat data1.txt hello world $cat errors.txt my warning message at 2perl.pl line 11.
      EDIT: In fact, I just tried using STDOUT and STDERR as the third argument to open() without quotes around them, and that works too: the output is the same.

        Then go for it. Some functions have funky parsing rules that accept barewords. Some functions accept the names of file handles. This is has does both.

        However, I disagree that passing a file handle* to a function that expects a file handle is somehow more complex than passing the name of the file handle you want to pass. (I should have used *STDOUT, though. There was no need to take a reference, although references to glob work a bit more often than just globs.)

        By the way, the real name for "quoted bareword" is "quoted string literal" or (laxly) "quoted string".

        * — Well, technically, the file handle is obtained by dereferencing *STDOUT{IO}, but *STDOUT is one step closer than 'STDOUT'.