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

In your original script you had a line "use strict;". Did you remove that line? It does seem that way, because otherwise the line "@fields = sort (@ElencoCampi);" would have given an error because you are using the global variable @fields instead of a local variable generated with my.

If you add a line "print \@fields;" to your loop you will see the problem, the reference never changes, it is always the same. But you need a new variable in every iteration of the loop so that they point to different memory locations

Change that line to "my @fields = sort (@ElencoCampi);" and your problem should go away.

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

Replies are listed 'Best First'.
Re^10: Hash of Arrays or Arrays of arrays? and how proceed?
by paride (Initiate) on Aug 09, 2011 at 08:36 UTC

    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.....

      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"?