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

I have a small problem perl code program maybe you can reply within a few minutes.. My problem is that I transfered my data into hash(hash of hash)... I can access any element in hash in our loop.. But When I try to access from  out of loop or out of function I cant... I initilizaed empty hash but I didnt work.. How can use my hash,and how can I make it global... If you have time and if you can look my code , I will be happy... Thanks..here my code

#!/usr/bin/perl $putword=0; $q63=7; &getfile("query63.txt"); sub getfile { open (FILE, $_[0]); my @data = <FILE>; close (DATA); for($i=0; $i<=$#data;$i++){ $index=$i; @words=split(/\s+/,$data[$index]); $count=$#words; if($count==2) { @words = split(/\s+/,$data[$index]); $count=0; $putword=$putword+1; if ($words[2] != 0){ $ctf=$words[1]; $df=$words[2]; } } else { @words = split(/\s+/,$data[$index]); %query=($putword =>{ctf=>$ctf, df=>$df, $words[1]=>{doclen =>$words[2], tf =>$words[3], } }, ); #When I write here,I can get value..here inside the loop #print $query{2}{1}{doclen}; } } #when I write here,I got nothing,,this is outside of loop.. print $query{2}{1}{doclen};But }

Replies are listed 'Best First'.
Re: accessing hash
by toolic (Bishop) on May 28, 2010 at 16:21 UTC
Re: accessing hash
by jethro (Monsignor) on May 28, 2010 at 16:28 UTC

    I had to indent your code before I was able to read it. Then I simplified it a bit, so that I could execute it (I needed a substitute for your data file):

    #!/usr/bin/perl use warnings; $putword=0; $q63=7; &getfile("query63.txt"); sub getfile { @data=(1); for($i=0; $i<=$#data;$i++){ $index=$i; @words=split(/\s+/,$data[$index]); if(3==2) { if (1 != 0){ } } else { @words = split(/\s+/,$data[$index]); %query=(2 =>{ctf=>5, df=>5, 1=>{doclen =>42, tf =>5, } }, ); #When I write here,I can get value..here inside the loop + print "inside ",$query{2}{1}{doclen},"\n"; } } #when I write here,I got nothing,,this is outside of loop.. print "outside ", $query{2}{1}{doclen},"\n"; } # prints: #inside 42 #outside 42

    The output was as expected quite sensible. So if you don't get anything outside the loop, your loop probably deleted or overwrote again the data it printed inside the loop

    Very good advice from toolic, especially Data::Dumper should help you greatly in finding the problem.

      especially Data::Dumper should help you greatly in finding the problem

      In my opinion, Data::Dumper is the end-all-be-all solution to the 'my-data-isn't-what-I-expected' problem. It can help you to solve all sorts of riddles, from a malformed hash, to using a variable out of scope and not being able to figure out why it's always null.

      As mentioned above, definitely use strict and warnings. The perl interpreter is usually very good at detecting when you've done something that you didn't want to, at least when it comes to misusing assignments, scope violations, etc., but you'll never see those messages without those directives.
      A reply falls below the community's threshold of quality. You may see it by logging in.
Re: accessing hash
by choroba (Cardinal) on May 28, 2010 at 16:22 UTC
    By assigning to %query, you delete all its previous content. You should not use %query=($putword=> ...), but rather something like $query{$putword} = {...}
      Hey chroba.. When I write like "$query{$putword} = {...}", I got sytax error mesage.. Can you write exact sentencez? thanks
        "$query{$putword} = {...}" is correct. Maybe you forgot to remove the final ')'. Check opening and closing parens.