in reply to Returning more than two arrays to the subroutine

This node falls below the community's threshold of quality. You may see it by logging in.
  • Comment on Re: Returning more than two arrays to the subroutine

Replies are listed 'Best First'.
Re^2: Returning more than two arrays to the subroutine
by stevieb (Canon) on Aug 18, 2015 at 16:42 UTC

    That is not helpful at all for anyone else who has been following the thread, or will read it in the future.

    I gathered the same thing choroba said, that you're using @nodes instead of @$nodelist.

    We have provided you with a lot of help, so please have the decency to post what you found and what you changed for completeness.

      My applogies for not mentioning what changes i made which helped me run the script successfully. This is what i did in the subroutine to receive the arrays from the subroutine:
      my ($node_ref,$error_ref)=get_node(); my @nodes=@$node_ref; my @errorlist=@$error_ref;
      and here is the return statement from the subroutine get_node
      return(\@serverlist, \@errorlist);
      Below is the snippet of main subroutine and get_node subroutine:
      sub main { my $path = 'E:/scripts/OutageNodes/'; require $path.'omwNodeDetails.pm'; open_log($path.'maintenanceMode_'); my $mode=get_mode(); my ($node_ref,$error_ref)=get_node(); my @nodes=@$node_ref; my @errorlist=@$error_ref; if( $mode eq 'enable'){ enable_unplanned_outage(@nodes); } elsif($mode eq 'disable'){ disable_unplanned_outage(@nodes); } else { printLog("Error invalid Mode $mode"); } printLog("There were ".scalar @errorlist." failed servers out of ".sca +lar @nodes." in serverlist"); # clear serverlist printLog ("Truncating serverlist"); open( SRV,'>',$path.'serverlist.txt') or die "Can't open SRV '$path.serverlist': $!"; close SRV; close_log(); }
      sub get_node { my @errorlist=(); my $sPath='e:/scripts/OutageNodes/'; my $sInFile=$sPath.'serverlist.txt'; my @sContent=(); my $sText; ##checks if the file exists and pulls the info out if (-e $sInFile){ open INFILE, '<', $sInFile or die "Could not open $sInFile : $!"; while (<INFILE>){ chomp; $sText="$_"; push @sContent,$sText; } close INFILE; } else { printLog("ERROR Cannot open $sInFile"); } # check serverlist had entries if (@sContent == 0){ printLog("ERROR No nodes found in serverlist.txt"); close_log(); exit; } #get FQDN************ my $hostname; my $fqdn; my @serverlist; for my $NODE (@sContent){ ($hostname) = split /\./, $NODE; $fqdn = getNodeAttributes($hostname,'PrimaryNodeName'); if(length($fqdn) < 1) { printLog("No value returned from WMI, node ($NODE) doesn't ex +ists in OMW."); push @errorlist,$fqdn; next; } else { push(@serverlist,$fqdn); } } return(\@serverlist, \@errorlist); }
      Only issue i see is ".scalar @nodes." is giving 0 value, even when i am truncating the serverlist.txt file after this print statement.

        What does @nodes contain right before you call scalar() on it? You don't check in main() to see whether or not it is empty. Do enable_unplanned_outage() and disable_unplanned_outage() check to see whether there is anything in the array they are passed?

        Also, if you just get an arrayref from get_node and only use it to pass it on to other subs (besides your print warning), why dereference it? You might as well pass the arrayref to the next sub and only dereference it when you need to use it.

        The way forward always starts with a minimal test.

        Great job. Thank you for the update.