I need to do some matching of filenames in two top level directories.
We expect to find a number of cases where the endnames ($_) are the
same in both hierarchies but the full name is different.

  base1/my/file
  base2/my/different_path/file
 
I've made hashes of the file names in two top level directories:

I've assembled the hashes using File::Find. We sort them first by
matching the base directory to the top directories passed in.

My first impulse wast to do it by matching the endnames (or value) in
one hash to any matching endname (value) in the other.  There are
several more actions that follow (not coded yet) but That's a lot of
spinning... 

I'm thinking there are better ways to do that.  So .. the script below
does it the hard way, with all that spinning.  Can anyone suggest
another way?

-------        ---------       ---=---       ---------      -------- 
#!/usr/local/bin/perl
  
use strict;
use warnings;

use File::Find;
use Cwd;

 my $r1 = shift;
 my $r2 = shift;
 my %r1h;
 my %r2h;

my $r1hkcn = 0;
my $r2hkcn = 0;

find(
  sub {
    ## For use in guaranteeing the -f command uses the
    ## right path
    my $dir = getcwd;
      if (-f $dir . '/'. $_) {
        ## Determine if base dir matches r1 or r2
        (my $base) = $File::Find::name =~ m/^(\.*\/*\/[^\/]+)\//;
        if ($r1 eq $base) {
          $r1h{$File::Find::name} = $_;
          $r1hkcn++;
          if ($r1hkcn == 1) {
            print "v:$File::Find::name   k:$_\n";
          }
        } else {
          $r2h{$File::Find::name} = $_;
          $r2hkcn++;
          if ($r2hkcn == 1) {
            print "v:$File::Find::name   k:$_\n";
          }

        }
      }
   },
   $r1,$r2
);

my ($r1full,$r1end);
while (($r1full,$r1end) = each(%r1h)) {
  foreach my $key (keys %r2h) {
    if ($r2h{$key} eq $r1end) {
       print "$r2h{$key} MATCHES $r1end\n";
    }
  }
}


-- 
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to