Hi Robert,

Thanks!
This wasn't the clue that solved my problem, but it works now.
I had the third if-statment placed in a different routine uniq(). Never thought of it 
to place
it within the while loop. which was necesary (of course !!).

This is how it looks right now :

....
...

  find(\&files, $directory);

 # ---

 sub files {

   $file = $File::Find::name || shift;
    next if($file =~ "ref.txt");
    if ( $file =~ /\.txt$/ ) {
      open (FILE, $file);
       while (<FILE>)  {
         $_ = lc ;
          $found{$file}{1} = 0;
          $found{$file}{2} = 0;
          if ($_ =~ /$word/i) {
            ++$found{$file}{1};
          }
          if ($_ =~ /$second/i) {
            ++$found{$file}{2};
          }
          if ( ($found{$file}{1} >= 1) && ($found{$file}{2} >= 1) ) {
            push(@matches, $file);
          }
       } # End while
    }

 } # end sub files
 
Thanks a lot for your help !!


Regs David
------------------------
> 
> It sounds like either use strict or use warnings (-w on the shebang line) is causing 
>the error. If you add:
> 
> $found{$file}{1} = 0;
> $found{$file}{2} = 0;
> 
> before the two if's, that should suppress the error message (hopefully).
> 
>       What I think was happening is that one of the strings never matched, and 
>therefore either the {1} or the {2} did not get incremented at all. When the 
>greater-than-or-equal ( >= ) tried to compare a variable that did not exsist, the 
>'strict' or 'warning' gave an error. The fix above initializes each variable to zero, 
>so hopefully this will satisfy 'strict' or 'warnings'.
> 
>       The gist of the last logic is to check each counter and if both are positive, 
>we have a match (don't we?). So, we compare the first counter, $found{$file}{1} and 
>check if it's >= to 1: ($found{$file}{1} >= 1). We do the same thing with the second 
>counter: ($found{$file}{2} >= 1). Since you were looking for a match only if both 
>strings were found, we want to make sure test1 and test2 above are true in our if 
>statement: if ( (test1) && (test2) ) { code }. If both are true, we want to record 
>the $file that matched, so we push the file name onto the @matches array: 
>push(@matches, $file).
> 
> Hope this helps,
> 
> =-= Robert T.
> 
> 
> On Wed, Jun 26, 2002 at 02:07:39PM +0200, David vd Geer Inhuur tbv IPlib wrote:
> > 
> > Hi Robert,
> > 
> > Looks good, but doens't work :)
> > 
> > The if-statements work fine within the while-loop.
> > After that you do something I realy don't get and my perl either :)
> > 
> > It start complaining :
> > Use of uninitialized value in numeric ge (>=) at /user/web/apache/cgi-bin/IPlib/1 
>line 88, <FILE> line 471
> > 
> > Any idea, what goes wrong ??
> > Maybe you can give me a litlle more explenation ?? Hope you have the time for it.
> > B.T.W. @matches is completely empty.
> > 
> > Regs David
> > 
> > # -----------------------
> > 
> > 
> > > 
> > > > So in short :
> > > > I want to match 2 words within .txt documents, if the document contains BOTH 
>words I'dd like to print it.
> > > 
> > >   I am assuming you mean strings, whereas a word would be surrounded by space 
>ala: /\s$word\s/. To rephrase what you want a little, you want to track how many 
>times string one is found in a file, track how many times string two is found in the 
>same file, and keep the file only if both strings are found in the file.
> > > 
> > > while (<INFILE>) {
> > >   if ($_ =~ /$string1/i) {
> > >     ++$found{$file}{1};
> > >   }
> > > 
> > >   if ($_ =~ /$string2/i) {
> > >     ++$found{$file}{2};
> > >   }
> > > }
> > > 
> > > if ( ($found{$file}{1} >= 1) && ($found{$file}{2} >= 1) ) {
> > >   push(@matches, $file);
> > > }
> > > 
> > >   Each filename must be unique, since they are used as the keys for the hash.
> > > 
> > > 
> > > =-= Robert T.
> 
> -- 
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 
> 

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to