in reply to redirect stdout into hash

Why do you need a hash? An array might be simpler. With a hash, you will need to increment a hash key counter, whearas with an array, you just keep pushing each recv into the array in order received. Anyways, for a hash, something like this would work. There is one glitch, since you are reading a $buf of size 1024, you have no idea where the newlines are going to be, so each hash entry may be an incomplete line, which is continued in the next hash entry. It may be better to concantate all received $buf into one long string, then split the string on newlines at put those lines into a hash.
use warnings; use Net::SSH2; use Data::Dumper; my $ssh = Net::SSH2->new(); # make a global hash for storage my %hash; # make a global counter for incrementing the hash keys my $counter = 0; ...... ...... if($ssh->auth_ok()) { runcmd(my_channel($ssh), "$bigcmd"); } # read output ( but lines may be split ) print $DATA::Dumper( \%hash ),"\n"; __END__ sub runcmd { my ($channel, $command) = @_; $channel->exec($command);# or die $@ . $ssh->error(); my $buff; while(!$channel->eof()) { my $buff; $channel->read($buff, 1024); # print $buff; $hash{$counter} = $buf; $counter++; } my $rc = $channel->exit_status(); $channel->close(); return $rc; }

I'm not really a human, but I play one on earth.
Old Perl Programmer Haiku ................... flash japh

Replies are listed 'Best First'.
Re^2: redirect stdout into hash
by doctorspears (Novice) on Jun 13, 2012 at 18:09 UTC
    Its seems everyone is right that an array may be easier. For memory efficiency, what is the best way to pipe the output into an array?
      If you want to change from hash, a concated scalar string is probably your best bet, unless you need an array of lines.Here is how to do either way.
      # make a global array for storage my @array; #or make a global scalar string my $storage_string; ..... ..... while(!$channel->eof()) { my $buff; $channel->read($buff, 1024); # print $buff; push @array, $buf; # pushes $buf into next array slot # or use a concated string $storage_string .= $buf; # concantates $buf onto end of stri +ng }
      When you want to read the array, you have a couple of options. Since your newlines may still be out of place, you may get staggered lines, but if you print the array it may reassemble itself properly
      $/ = ''; # change output separator to nothing instead of newline print @array, "\n";
      but this just recreates a string with embedded newlines

      If you go with the concated string route, you can easily split on newlines:

      my @lines=split( /\n/, $storage_string); print "@lines\n"; # or since $storage_string contains embedded newlines, just printing i +t would work print "$storage_string\n";
      Either way, an array joined with the output separator set to '', or a concated string split on newlines should give good results.

      I'm not really a human, but I play one on earth.
      Old Perl Programmer Haiku ................... flash japh
        Thanks, it worked perfectly without the concatenated string!