in reply to Re^9: Hash of Arrays or Arrays of arrays? and how proceed?
in thread Hash of Arrays or Arrays of arrays? and how proceed?

I haven't removed strict, it work cause I've added at the start of the script "our @fields;" and yes, if I try to print "print \@fields" it doesn't use different addresses, so I've tried to put "my @fields" in the sub and it uses different addresses but outside the sub it still doesn't work. I think I've done some declaration errors...

It's strange cause if I remove "my @fields" from the sub (using only @fields) it print the last assigned values.....

  • Comment on Re^10: Hash of Arrays or Arrays of arrays? and how proceed?

Replies are listed 'Best First'.
Re^11: Hash of Arrays or Arrays of arrays? and how proceed?
by jethro (Monsignor) on Aug 09, 2011 at 15:00 UTC

    What do you mean with "it still doesn't work?". Does it still print the last assigned values or something else?

    One thing I'm very sure, you need the "my" before "@fields" in the sub, otherwise it will never work. That doesn't mean this was the only bug

    What does Dumper tell you directly after returning from the subroutine, i.e. what do you get when you write

    my $xyz= SubAcquisisciDatiCampiEsistenti( ...) #somewhere in your scr +ipt you have a line like this where you call the subroutine print Dumper($xyz); #<----- add this, but use the variable name you +are using

    You should see the complete data in all its details. Does it seem correct? If not, there must be still a bug in the subroutine or how it is called. If all is correct, the bug must be somewhere later

    Now move the Dumper(...) line further and further down your script to check how $xyz looks like in later stages of your script. If you extract data to other variables who later exhibit the problem, check them out with Dumper too. Follow the trail of your data ;-)

    As soon as your data doesn't look correctly anymore you know exactly where the bug is, between the last correct place and this place.

    My guess would be that you forgot to assign the return value of the subroutine to the right place or you are looking at the wrong variables. But you can check yourself, just use Dumper and never take anything for given, test every assumption you have.

      I was making a mountain out of a molehill! And I was trying to print the dumper outside the sub in the wrong way.... usyng "my" in the suggested place it's OK

      but I've one more question on the result obtained printing the dumper outside the sub

      in this environment I've two DB, same file but different fields, the result of the dumper outside is:

      my $risultato = SubAcquisisciDatiCampiEsistenti($file,@Databases); print "\n\n\n ################# Stampa dati FUORI SUBROUTINE ##### +##########\n\n\n"; print Dumper($risultato); my $i=0; foreach (@Databases) { print "\n"; print "Il primo campo disponibile del file $file sul Database +$_ e': "; print $risultato->{$_}{next}[$i]; print "\n"; $i+=1; }
      $VAR1 = { '6' => { 'next' => [ 'AQ', 'AO' ], 'fields' => [ 'AA,8,U,DE', 'AB,8,U,I', 'AC,14,U,I', 'AD,8,U,DE', 'AE,8,U,DE', 'AF,8,A,DE', 'AG,8,U,DE', 'AH,7,U,I', 'AI,8,U,DE', 'AJ,7,U,I', 'AK,5,A,DE', 'AL,10,A,I', 'AM,2,A,DE', 'AN,14,U,I' ] }, '5' => { 'next' => $VAR1->{'6'}{'next'}, 'fields' => [ 'AA,8,U,DE', 'AB,8,U,I', 'AC,14,U,I', 'AD,8,U,DE', 'AE,8,U,DE', 'AF,8,A,DE', 'AG,8,U,DE', 'AH,7,U,I', 'AI,8,U,DE', 'AJ,7,U,I', 'AK,5,A,DE', 'AL,10,A,I', 'AM,2,A,DE', 'AN,20,U,I', 'AO,20,A,DE,NU', 'AP,10,U,MU' ] } };

      Question: Is it correct the line "'next' => $VAR1->{'6'}{'next'}" ? If I got it right, this line is a reference to a reference? And it correctly point to "AQ"?

        You are right, this is a reference to the same hash as above, i.e. this is not correct. @nextfield has the same problem as @field had, i.e. it is a global variable, not a new one every time. So every next hash entry points to the same hash. Solution:

        Add "my @nextfield;" in the subroutine near the location where "my @field= sort(..." is.