Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

Re: capture STDOUT without printing to screen

by hmerrill (Friar)
on Dec 01, 2004 at 15:56 UTC ( [id://411481] : note . print w/replies, xml ) Need Help??


in reply to capture STDOUT without printing to screen

I can't see why backticks won't work:
my @output_lines_array = `/path/to/your_executable`; foreach my $line (@output_lines_array) { if (/^No. of sequences \(letters\): ([\d,])\s/) { print "No. of sequences = $1\n"; } }
I'm a little out of practice so beware, but hopefully it's close.

Replies are listed 'Best First'.
Re^2: capture STDOUT without printing to screen
by k99ja04 (Initiate) on Dec 03, 2004 at 09:02 UTC

    I am using Mac OS X so it is unix. Here's my full code.

    #!/usr/bin/perl -w if (@ARGV==0) { die "Usage: countseq.pl <dbname>\n"; } my $prog = "/usr/ncbi/blast2/xdformat -n -i $ARGV[0]"; my $strOutput; my @output = `$prog`; foreach my $line (@output) { if (/^No. of sequences \(letters\): ([\d,])\s/) { $strOutput = $1; } } die "No output gathered \n" unless defined($strOutput); print $strOutput;

    So from the shell here's what I get.

    myshell$ ./countseq.pl human
    Version
    Release date:
    Creation date: 2:17:09 AM EST Nov 19, 2004
    Modified date: 2:17:09 AM EST Nov 19, 2004
    Type: Nucleotide
    Alphabet: NCBI2na(1)
    No. of sequences (letters): 37,316 (33,115,935)
    Longest sequence: 1542
    Edit Alphabet: WUStLna(1)
    Max. edits: 41
    Total edits: 2693
    37316
    myshell$

    I just want to see the number on the bottom (37316) Any thoughts? Any idea on how to determine if xdformat is printing to anything other than STDOUT?
    Thanks, Jared

      As 'jfroebe' said below, xpdformat is probably also writing to STDERR (which is *NOT* captured by backticks). Read about STDERR by doing
      perldoc -q STDERR
      at a command prompt. The perldoc '-q' says to search the perldoc documentation for string "STDERR". Here's a snippet from that:
      Found in C:\Perl\lib\pod\perlfaq8.pod How can I capture STDERR from an external command? There are three basic ways of running external commands: system $cmd; # using system() $output = `$cmd`; # using backticks (``) open (PIPE, "cmd |"); # using open() With system(), both STDOUT and STDERR will go the same place as th +e script's STDOUT and STDERR, unless the system() command redirects +them. Backticks and open() read only the STDOUT of your command. Here's another snippet: ----------------------- You can also use file-descriptor redirection to make STDERR a dupl +icate of STDOUT: $output = `$cmd 2>&1`; open (PIPE, "cmd 2>&1 |"); And another snippet: -------------------- ...To capture a command's STDERR and STDOUT together: $output = `cmd 2>&1`; # either with backticks $pid = open(PH, "cmd 2>&1 |"); # or with an open pipe while (<PH>) { } # plus a read
      Anyway, hope that helps.