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

Hi Perl Experts, Need your wisdom in solving my following problem. I have used File::Tee module in order to log the contents going to STDOUT in my program. However, i would also like the functionality of unix "less" command in my program to read some pages of content. But, since STDOUT is now tied to the log file, the system command is not producing the output in the format of unix "less" command but producing it as that of unix "cat" command. How should i reset STDOUT, so that the system command produces output in the required format.

use File::Tee; my $logfile = "log.txt"; File::Tee::tee STDOUT, { mode => '>>', lock => 1, open => $logfile }; # I tried to untie STDOUT but it did not work #untie STDOUT &pager(); sub pager { my $temp = "temp.txt"; my $pager = "less"; system("$pager $temp"); }

Replies are listed 'Best First'.
Re: Some system command not working as required after File::Tee
by tofanikanudo (Initiate) on Dec 13, 2010 at 12:30 UTC

    You can reset STDOUT in BEGIN block, Please refere follwoing code snippet, it might be helpful you.

    BEGIN { open STDERR, '> log.txt' or die "Can't Write to log.txt. Permission Denied!!!"; binmode STDERR; } &pager(); sub pager { my $temp = "temp.txt"; my $pager = "less"; system("$pager $temp"); }
      All I can say, smart solution !!!!! Kudos to tofanikanudo

        The only problem is that this snippet doesn't do what File::Tee does - which, as I understand, is important to the original poster...

Re: Some system command not working as required after File::Tee
by salva (Canon) on Dec 13, 2010 at 13:16 UTC
    Just redirect the pager output to /dev/tty:
    sub pager { my $temp = "temp.txt"; my $pager = "less"; my $tty = "/dev/tty"; system("$pager $temp >$tty"); }
      Thanks salva!! This did the trick. STDOUT is now tied to the terminal be redirecting to /dev/tty and system command works correctly.
Re: Some system command not working as required after File::Tee
by andal (Hermit) on Dec 13, 2010 at 15:50 UTC

    It is really not clear what you want to have. If you use File::Tee, then your STDOUT is copied both to your terminal and to the file. But if you try to use "less", then you'll get some junk in the log file, if the output from "less" is piped to your STDOUT as well. So, you don't really want to use File::Tee, or you should stop it before launching pager. As far as I can see, the only way to do it with File::Tee is to kill the forked process.

    Maybe it makes more sense for you to open new file handle to log file, and then Tee it into STDOUT? Then you can print everything into that file handle and see things on terminal as well. Something like

    use File::Tee; my $logfile = "log.txt"; open(LOG, ">>$logfile"); flock(LOG, 2); File::Tee::tee LOG, ">&STDOUT"; print LOG "some message\n"; &pager(); sub pager { my $temp = "temp.txt"; my $pager = "less"; system("$pager $temp"); }