in reply to Re: comparing two arrays
in thread comparing two arrays

I think I got overly excited - It's still not working The $_ in the hash seems to be blank and every run through comes back with the @report value does not exit in the @file. More help is surely appreciated.

use strict;
my $file='d:\mms_tableload.txt';
my @file=();
open(FILE,$file);
@file = <FILE>;
close(FILE);
my @report = qw(sarak_mike mike);
my %in_file = map{$_ =>1} @file;
my $all_match = 1;
foreach (@report) {
if (! exists $in_file {$_} ) {
$all_match = 0;
print "\@report value: '$_' is not in \@file.\n";
}
}
print "All values in \@report found in \@file\n" if
$all_match;

Replies are listed 'Best First'.
Re: Re: Re: comparing two arrays
by jlongino (Parson) on Nov 25, 2001 at 22:12 UTC
    I've never seen the syntax  @file = ; (and I'm not doubting you, just curious) but are you checking to see what the contents of @file are before you enter the while loop? Also you should be sure to put  chomp @file; before the loop since you might have newlines in the file at the end of each record ("\n").

    Keep us posted.

    --Jim

    Afterthought: It is usually helpful when I'm debugging to use snippets similar to the following for testing arrays:

    my $i = 0; foreach (@file) { print "\@file[", $i++, "] = '$_'\n"; }
    It helps spot newlines, incorrect subscripting and such.

    Update: In case it is not clear from the previous posts, we're assuming that the file  'd:\mms_tableload.txt' looks like this:

    sarak_mike\n mike\n some\n other\n data\n
    The hash lookup must be an exact match (including newlines and case sensitivity). If there is other extraneous information like HTML tags embedded in @file, then you may need to use a different method that searches strings (like grep, or m/$_/), and this can be tricky since you'd have to insure that your search for "mike" doesn't match positve to "sarak_mike". </code>
      Sorry for not providing all the info, but the file looks like this,

      Insp_data table loaded successfully 2001-11-26 00:34:58.61 with 284734 records.
      Inventory_trans_temp table loaded sucessfully 2001-11-26 01:31:08.88 with 498 records.
      Invoice_extension table loaded successfully 2001-11-26 01:37:07.85 with 165287 records.
      Invoice_header table loaded successfully 2001-11-26 01:45:04.79 with 165321 records.

      My objective is to locate and compare the table names in the file with an array which may possibly conatin these same names.

        This should work. Don't forget to substitute your filename for the one I used.
        use strict; my @file; my @report = qw(sqltable mike_test sarak_mike); open INFILE, "<mms_tableload.txt"; ## The following statement stuffs the lowercased first "word" of each +record into @file. push @file, lc((split)[0]) foreach (<INFILE>); my $i = 0; foreach (@file) { print "\@file[", $i++, "] = '$_'\n"; } print "\n\n"; my %in_file = map{$_ =>1} @file; my $all_match = 1; foreach (@report) { if (! exists $in_file{$_}) { $all_match = 0; print "\@report value: '$_' is not in \@file.\n"; } }
        Where the data file for @file looks like this:
        Mike table loaded successfully 2001-11-26 00:34:58.61 with 284734 reco +rds. MiKe_Test table loaded sucessfully 2001-11-26 01:31:08.88 with 498 rec +ords. sarak_Mike table loaded successfully 2001-11-26 01:37:07.85 with 165 r +ecords. Inv_hdr table loaded successfully 2001-11-26 01:45:04.79 with 165321 r +ecords.
        The output:
        @file[0] = 'mike' @file[1] = 'mike_test' @file[2] = 'sarak_mike' @file[3] = 'inv_hdr' @report value: 'sqltable' is not in @file.

        --Jim