in reply to Comparing an array against another array

If you are looking for a known list of files, it is very handy to use a hash.   Insert all of the expected file names into the hash, then remove each name as you encounter it.   At the end of the traverse, the hash should be empty.

If dealing with a case-insensitive file system, normalize the names by shifting them to lowercase before inserting them or checking them.

  • Comment on Re: Comparing an array against another array

Replies are listed 'Best First'.
Re^2: Comparing an array against another array
by jaldama (Acolyte) on Jan 18, 2012 at 15:57 UTC

    Yeah, definitely way easier Mr. Anonymous.

    my @hostFiles = qw/filecheck.pl hostscript.pl awesomeness.txt/; my @output =`ssh $hostname "cd Desktop; ls -a"`; my %comparison; for my $file (@hostFiles) { $comparison{$file} +=1; } for my $file (@output) { $comparison{$file} +=2 } for my $file (sort keys %comparison) { @missing = "Missing file: $file\n" if $comparison{$file} ==1; print "Extra file: $file\n" if $comparison{$file} ==2; }

    Now I'm just working on filtering out duplicate results and I should be good, hurray!

      What's going on: I've ssh'd onto my localhost, ls the desktop and taken those items and put them into an array I hardcoded a short list of items and I am comparing them with a hash to see if anything is missing from the host (See if something from a is NOT in b, and let me know). So after figuring that out, when I print out the "missing files" I get a bunch of duplicates (see below), not sure if that has to do with how the files are being checked in the loop, but I figured the best thing to do would be to just sort out the data and eliminate dupes. When I do THAT, and print out the fixed data, only one file is printing, two are missing. Any idea why?

      #!/usr/bin/perl my $hostname = $ARGV[0]; my @hostFiles = ("filecheck.pl", "hostscript.pl", "awesomeness.txt +"); my @output =`ssh $hostname "cd Desktop; ls -a"`; my %comparison; for my $file (@hostFiles) { $comparison{$file} +=1; } for my $file (@output) { $comparison{$file} +=2 } for my $file (sort keys %comparison) { @missing = "$file\n" if $comparison{$file} ==1; #print "Extra file: $file\n" if $comparison{$file} ==2; print @missing; } my @checkedMissingFiles; foreach my $var ( @missing ){ if ( ! grep( /$var/, @checkedMissingFiles) ){ push( @checkedMissingFiles, $var ); } } print "\n\nThe missing Files without dups:\n @checkedMissingFiles +\n"; Password: awesomeness.txt ##This is what is printing after comparing the two + arrays awesomeness.txt filecheck.pl filecheck.pl filecheck.pl hostscript.pl hostscript.pl The missing Files without dups: ##what prints after weeding out duplic +ates hostscript.pl