Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling
 
PerlMonks  

Unable to print the contents of an array reference passed from the main pgm to the flat file

by Anonymous Monk
on Aug 23, 2010 at 13:56 UTC ( [id://856707]=perlquestion: print w/replies, xml ) Need Help??

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

Hello Monks,

We are passing an array reference of results sets from the main program to this function which prints the contents of the result sets to the flat file. In this case,not able to print the contents. here is the code snippet of the function

The array reference is in argument 6

sub pkoutFile { my(@args)= @_; my($val, $i,$j,$k,$k1,$ln,@ff,@ss,$delim1, $delim2, @paramVals ); # 0 1 2 3 4 5 + 6 my($outFH, $delims, $branchID, $sourceSystem, $valDateY4MD, $rate +Type, $rowsHdl ) = @args[0..6]; $colNamesHdl = $args[7] if ($#args >= 7); $delims =~ s/(^[\n\r\s\t]+)|([\n\r\s\t]+$)//g; $branchID =~ s/(^[\n\r\s\t]+)|([\n\r\s\t]+$)//g; $valDateY4MD =~ s/(^[\n\r\s\t]+)|([\n\r\s\t]+$)//g; $sourceSystem =~ s/(^[\n\r\s\t]+)|([\n\r\s\t]+$)//g; $rateType =~ s/(^[\n\r\s\t]+)|([\n\r\s\t]+$)//g; $delim1 = substr($delims,0,1); $delim2 = substr($delims,1,2); printf($outFH "H\^%s\^%s\^%s\^%08d^\n", $delims, $branchID, $sourceS +ystem, $valDateY4MD); # determine the field names if ($colNamesHdl) { @ff=(); for ($i=0; $i <= $#$colNamesHdl; $i++) { push(@ff, $$colNamesHdl[$i]); } } else { $k = $$rowsHdl[0]; @ff = keys(%$k); } $j = $#$rowsHdl; for ($i=0; $i <= $j; $i++) { @paramVals = (); foreach $k (@ff) { $k1= $k; $k1 =~ s/(^[\n\r\s\t]+)|([\n\r\s\t]+$)//g; $val = $$rowsHdl[$i]->{$k}; # add logic here to make sure that the delims are NOT in the tex +t push(@paramVals, $k . $delim2 . $val); } print($outFH ('C^D^' . $rateType . '^' . join($delim1, @paramVals +) . "^\n")); } print($outFH "T^${branchID}^${sourceSystem}^\n"); }

Need your help to print the contents of the array reference to the file

  • Comment on Unable to print the contents of an array reference passed from the main pgm to the flat file
  • Download Code

Replies are listed 'Best First'.
Re: Unable to print the contents of an array reference passed from the main pgm to the flat file
by roboticus (Chancellor) on Aug 23, 2010 at 14:07 UTC
Re: Unable to print the contents of an array reference passed from the main pgm to the flat file
by moritz (Cardinal) on Aug 23, 2010 at 14:10 UTC
    In this case,not able to print the contents.

    What happens?

    It would be easier if you minimized your code to a few lines which demonstrate your problem, and without the other code that is of no interest to us.

    You should also read perlreftut, which introduces you to references in Perl.

    Perl 6 - links to (nearly) everything that is Perl 6.
Re: Unable to print the contents of an array reference passed from the main pgm to the flat file
by wfsp (Abbot) on Aug 23, 2010 at 14:09 UTC
    update: ignore this, I misread the start of the script :-(

    Is argument 6 @ff? If so it looks as though it is getting clobbered when you "determine the field names".

    # determine the field names if ($colNamesHdl) { @ff=(); for ($i=0; $i <= $#$colNamesHdl; $i++) { push(@ff, $$colNamesHdl[$i]); } } else { $k = $$rowsHdl[0]; @ff = keys(%$k); }
    Either unshift the field names onto @ff or perhaps just print the field names outside your for loop and leave @ff well alone.

    update: changed shift to unshift

Re: Unable to print the contents of an array reference passed from the main pgm to the flat file
by murugu (Curate) on Aug 23, 2010 at 14:13 UTC
    Hi,

    As per the given details, Its not clear what really is your requirement. If getting the contents of 6th argument($rateType ) means, You have to access the array as @$rateType.

    It would be lot helpful if you mention the requirement with sample input and details about how this subroutine is called etc

    Regards,
    Murugesan Kandasamy
    use perl for(;;);

      The above function being called via the following

      &pkoutFile($OUTFP, ';:=~',"301","WPSPD", $valDate1, "SPREAD", \@retArr +ay);

      where \@retArray is the array reference which contains the result set. We are able to access the contents of the result set in the above function, but unable to copy the contents to the hash variable @ff. Code snippet for this is given below. $rowsHdl is the array reference

      # determine the field names if ($colNamesHdl) { @ff=(); for ($i=0; $i <= $#$colNamesHdl; $i++) { push(@ff, $$colNamesHdl[$i]); } } else { $k = $$rowsHdl[0]; @ff = keys(%$k); } $j = $#$rowsHdl; for ($i=0; $i <= $j; $i++) { @paramVals = (); foreach $k (@ff) { $k1= $k; $k1 =~ s/(^[\n\r\s\t]+)|([\n\r\s\t]+$)//g; $val = $$rowsHdl[$i]->{$k}; push(@paramVals, $k . $delim2 . $val); }
        I would suggest adding some print Dumper statements in to make sure that you have the kind of thing that you think that you have...

        Running some simple test should provide some light on what data this pkoutFile sub is really getting. I simplified your statement to input the sub's input args - avoid using indicies unless you have to - Perl is designed so they aren't needed nearly as often as in other languages.

        #!/usr/bin/perl -w use warnings; use Data::Dumper; pkoutFile($OUTFP, ';:=~',"301","WPSPD", $valDate1, "SPREAD", \@retArray); sub pkoutFile { my( $outFH, $delims, $branchID, $sourceSystem, $valDateY4MD, $rateType, $rowsHdl, $colNamesHdl)= @_; print Dumper \$rowsHdl; #$colNamesHdl is undefined in this case #so, it appears that this following code is executed $k = $$rowsHdl[0]; # $rowsHdl->[0] print Dumper \$k; @ff = keys(%$k); print Dumper \@ff; }
        update: I noticed that for example the k1 value has a calculation done on it, but is never printed. With further looking, if the intent of the regex you want is to remove leading and trailing spaces, I would suggest this:
        foreach ($delims, $branchID, $valDateY4MD, $sourceSystem, $rateType) { s/^\s+//; #remove leading spaces s/\s+$//; #remove trailing spaces }
        This sets $_ to each of the scalar variables in turn and then runs 2 simple and fast regex'es that do not require the /g switch. In this case $_ is an alias for the variable (like $delims) and changes in the loop are reflected in changes to the actual variable.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://856707]
Approved by Corion
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others scrutinizing the Monastery: (5)
As of 2024-04-23 16:18 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found