Thank you Dan and Wolf !   With the suggested changes, my foreach loop 
script now works as I hoped it would.   (My first script did have a typo, 
as you pointed out, though my logic was still wrong.)  I'm glad to be able 
to set aside my study of hashes for another day.  I needed to get this 
problem solved so that I can get some other work done. 

To correct the script, I added LABELS, used the next statement with a 
LABEL, and moved the $print statement out of the inner loop, and waalaa, 
it worked properly.  I quickly went over the logic of the working program 
and it makes sense. It's funny how things seem so clear once they're 
solved ! 

My files are actually probably only 30 to 35 lines each, so size isn't a 
problem.  The real data I'm comparing has email addresses in them.  File2 
will either match File1, or have new email addresses in them.  I then do 
stuff with the new email addresses.

Thanks again.  I really appreciate the help.

Here's the working program:

use strict;
use warnings;

my $file1;
my $file2;

my @file1 = qw(oranges apples bananas);
my @file2 = qw(apples kiwi bananas);

FILE2: foreach $file2 (@file2){
    FILE1: foreach $file1 (@file1){
        if ("$file2" eq "$file1") {
            next FILE2;
        }
    }
print "$file2 \n"; 
}

The output is "kiwi", which is exactly right. 
kiwi




wolf blaum <[EMAIL PROTECTED]> 
01/22/2004 08:38 PM

To
[EMAIL PROTECTED], [EMAIL PROTECTED]
cc

Subject
Re: Need help comparing lines in two files






> This very green newbie would like to compare two files, let's say File1
> and File2.   I
> want to put the difference from File2 only, into a new file, File3.

I had a very simliar problem about a week ago, which James answerd here:

http://groups.google.com/groups?q=Perl+looping+(a+lot+of)
+files&hl=en&lr=&ie=UTF-8&selm=28A16704-4AD3-11D8-9A03-000A95BA45F8%
40grayproductions.net&rnum=1

or try google groups "perl looping through (a lot of) files"

The only really difference is that I didnt want to compare one FILE2 to 
FILE1 
but 500.

However, be carefull on your filesize:
I settled reading one file into mem (as an array) and looping through the 
other ones using a while (<FILE2>)  reading the 500 files line by line.

> For example:
>
> File1.txt
> oranges
> apples
> bananas
>
> File2.txt
> apples
> kiwi
> bananas
>
> The result I want for File3 is the new entry in File2, which is kiwi. (I
> don't care that oranges was in File1 and not File2.)
>
> I tried using a nested foreach loop structure, but I can't get that to
> work and I have a feeling using nested foreach's is not the way to go.

why not?

> I'm guessing somehow I should use hashs, but I've never used a hash for
> anything and I don't really know how to use a hash.  Can someone help ?

do you need to associate the contens of the line with a filename ore 
something? if not, use an array.

> Here's my feeble attempt:
>
> my $file1;
> my $file2;
>
> my @file1 = qw(oranges apples bananas);
> my @file2 = qw(apples kiwi bananas);
>
As Dan showed:

FILE2:
> foreach $file2 (@file2){
>        foreach $file2 (@file2){
you may want 
         foreach my $file1(@file1){ 
here

>         #print "$mastervob $tempvob \n";
>         if ($file2 eq $file1) {
>             last;                       # I would like to go up to the
> toplevel "foreach" here, but I don't know how to do it
>             }                           # and I'm not sure this would 
even
> work.

as Dan said:
 
 next FILE2;

will do the job.


>         else{
>             print "$file2 \n";
>         }
>     }
> }

This doesent do what I assume you want: when you place the print in the 
inner 
loop.
Just look at the link above.

Hope thats a start, Wolf


Reply via email to