in reply to Re^4: Retrieving information from an executable program
in thread Retrieving information from an executable program

May you please look at this code and advice why the output isn't one of levels defines;
#!/usr/bin/perl use strict; use warnings; use Data::Dumper; my @output = `./retrieve 2301`; my ($name, $status, $cid); my $deref="LEVEL0"; my %vars = ( 'NAME' => \$name, 'CID' => \$cid, 'STATUS' => \$status, ); for my $line (@output) { $deref= "LEVEL1"; my ($key, $val) = split /:/, $line, 2; $deref="LEVEL2"; if ($vars{ $key }) { ${ $vars{ $key } } = $val; $deref= "LEVEL3"; } else { warn "Unknown key '$key', discarded"; $deref= "LEVEL5"; }; }; my $hashref = \%vars; print "\n$deref\n"; print "\n$hashref->{CID}\n"; print "\n$hashref->{NAME}\n"; print "\n$hashref->{STATUS}\n";

And the output is
CID: 2301 NAME:Jane STATUS:OK LEVEL0 SCALAR(0x8870e78) SCALAR(0x8870e60) SCALAR(0x8870e30)

Note that only LEVEL0 output is displayed. I have also notice that, the output for CID, NAME and STATUS are from ./retrieve backquotes.

Replies are listed 'Best First'.
Re^6: Retrieving information from an executable program
by Corion (Patriarch) on Jul 26, 2010 at 19:05 UTC

    I don't see how your output can be produced, but maybe that's because I don't see the input. It seems to me that the output of ./retrieve does not get captured in @output. What is the printout of

    #!perl -w use strict; use Data::Dumper; my @output = `./retrieve 2301`; print Dumper \@output;
      You are correct, it seems nothing is populated in @output variable
      CID:2301 NAME: Jane STATUS=OK $VAR1 = [];

      May you please advice how i can get @output filled by ./retrieve 2301
        I have contacted the program dev who changed their code from cerr to cout and now i can get the output. Please advice if there is anything more need to be done to optimize this code
        !/usr/bin/perl -w use strict; use warnings; use Data::Dumper; my @output = `./retrieve 2301`; chop @output; my ($name, $status, $cid); my %vars = ( 'NAME' => \$name, 'CID' => \$cid, 'STATUS' => \$status, ); for my $line (@output) { my ($key, $val) = split /:/, $line, 2; if ($vars{ $key }) { ${ $vars{ $key } } = $val; } else { warn "Unknown key '$key', discarded"; }; }; my $myID= ${ $vars{ CID } }; my $myStatus=${ $vars{ STATUS } }; my $myName=${ $vars{ NAME } }; print "My name is $myName with status $myStatus ID $myID\n";

        Output
        My name is Jane with status OK ID 2301