> -----Original Message-----
> From: perl-win32-users-boun...@listserv.activestate.com [mailto:perl-
> win32-users-boun...@listserv.activestate.com] On Behalf Of
> arvinport...@lycos.com
> Sent: Friday, December 09, 2011 4:33 PM
> To: perl-win32-users@listserv.ActiveState.com
> Subject: File::Find::Rule problem
> 
> I have a real head scratcher trying to exclude directories with
> File::Find:Rule version 0.32.
> 
> I have made a small test directory on my Windows XP machine with the
> following two files:
> 
> D:\My Documents\projects\dave\test\log.txt
> D:\My Documents\projects\dave\test\84_33 (Kland, Dan)\test.pl
> 
> I want to exclude the Kland directory and just return log.txt (I know I
> can set the depth of the find - this is just an illustrative problem
> for a much larger directory structure).
> 
> Here is my test program:
> 
> use File::Find::Rule;
> use strict 'vars';
> 
> my $rule =  new File::Find::Rule ();
> my @exclude = (qr/Kland, Dan/);
> $rule->or(
>    $rule->new->directory->name(@exclude)->prune->discard,
>    $rule->new
> );
> 
> my @files = $rule->file->in('D:\My Documents\projects\dave\test');
> 
> foreach my $file (@files) {
>    print STDERR "$file\n";
> }
> 
> It works as it should, only returning log.txt
> 
> However if I make certain changes to the exclude regex it fails (i.e.,
> the program runs fine but returns both files, including test.pl which
> it should not).
> 
> This works: my @exclude = (qr/\(Kland, Dan\)/); This works: my @exclude
> = (qr/84_33/); So does this (with a space at the end): my @exclude =
> (qr/84_33 /); This does not: my @exclude = (qr/84_33 \(Kland, Dan\)/);
> This doesn't work either (adding a single space in front): my @exclude
> = (qr/ \(Kland, Dan\)/); And this crashes with a lengthy
> File::Find::Rule compile error: my @exclude = (qr/84_33 \(/);
> 
> So, it's not the spaces, it's not the parentheses, it's ... something.
> 
> Can anyone see what I'm doing wrong, or at least replicate the problem?
> 
> Arvin
> 
> This is perl, v5.10.0 built for MSWin32-x86-multi-thread (with 5
> registered patches, see perl -V for more detail)
> 
> Copyright 1987-2007, Larry Wall
> 
> Binary build 1004 [287188] provided by ActiveState
> http://www.ActiveState.com Built Sep  3 2008 13:16:37
> _______________________________________________

Hello,
I had never used File::Find::Rule before, but I gave it a try.
ActivePerl 5.8.9 Build 826.

I set up a test with 3 files in the directory hierarchy:

D:/My Documents/projects/dave/test/should-print.txt
D:/My Documents/projects/dave/test/84-33 (Kland, Dan)/test.pl
D:/My Documents/projects/dave/test/84-33 Kland, Dan/test2.pl

Then ran the following code:

use strict;
use warnings;

use File::Find::Rule;
my $ctr = 1;

print "\n\n==============  START =====================\n";
while (my $pattern = <DATA>)
{
   chomp $pattern;

   my $rule =  new File::Find::Rule ();

   my $subctr = 'a';
   foreach my $modifiedPattern ( qr/\Q$pattern\E/, $pattern )
   {
      my @exclude = ($modifiedPattern);

      print "\n=============================================\n";
      print "==  $ctr$subctr >>$exclude[0]<<\n\n";

      $rule->or(
         $rule->new->directory->name(@exclude)->prune->discard,
         $rule->new
      );

      my @files = $rule->file->in('D:/My Documents/projects/dave/test');

      foreach my $file (@files) {
         print "$file\n";
      }
      $subctr++;
   }
   $ctr++;
}

__DATA__
Kland, Dan
(Kland, Dan)
84-33
84-33 
84-33 (Kland, Dan)
84-33 Kland, Dan
84-32

This produced the output listed below

==============  START =====================

=============================================
==  1a >>(?-xism:Kland\,\ Dan)<<

D:/My Documents/projects/dave/test/should-print.txt

=============================================
==  1b >>Kland, Dan<<

D:/My Documents/projects/dave/test/should-print.txt

=============================================
==  2a >>(?-xism:\(Kland\,\ Dan\))<<

D:/My Documents/projects/dave/test/should-print.txt

=============================================
==  2b >>(Kland, Dan)<<

D:/My Documents/projects/dave/test/should-print.txt

=============================================
==  3a >>(?-xism:84\-33)<<

D:/My Documents/projects/dave/test/should-print.txt

=============================================
==  3b >>84-33<<

D:/My Documents/projects/dave/test/should-print.txt

=============================================
==  4a >>(?-xism:84\-33\ )<<

D:/My Documents/projects/dave/test/should-print.txt

=============================================
==  4b >>84-33 <<

D:/My Documents/projects/dave/test/should-print.txt

=============================================
==  5a >>(?-xism:84\-33\ \(Kland\,\ Dan\))<<

D:/My Documents/projects/dave/test/should-print.txt
D:/My Documents/projects/dave/test/84-33 (Kland, Dan)/test.pl
D:/My Documents/projects/dave/test/84-33 (Kland, Dan)/test.pl~

=============================================
==  5b >>84-33 (Kland, Dan)<<

D:/My Documents/projects/dave/test/should-print.txt
D:/My Documents/projects/dave/test/84-33 (Kland, Dan)/test.pl
D:/My Documents/projects/dave/test/84-33 (Kland, Dan)/test.pl~

=============================================
==  6a >>(?-xism:84\-33\ Kland\,\ Dan)<<

D:/My Documents/projects/dave/test/should-print.txt
D:/My Documents/projects/dave/test/84-33 (Kland, Dan)/test.pl
D:/My Documents/projects/dave/test/84-33 (Kland, Dan)/test.pl~

=============================================
==  6b >>84-33 Kland, Dan<<

D:/My Documents/projects/dave/test/should-print.txt
D:/My Documents/projects/dave/test/84-33 (Kland, Dan)/test.pl
D:/My Documents/projects/dave/test/84-33 (Kland, Dan)/test.pl~

=============================================
==  7a >>(?-xism:84\-32)<<

D:/My Documents/projects/dave/test/should-print.txt
D:/My Documents/projects/dave/test/84-33 (Kland, Dan)/test.pl
D:/My Documents/projects/dave/test/84-33 (Kland, Dan)/test.pl~
D:/My Documents/projects/dave/test/84-33 Kland, Dan/test2.pl

=============================================
==  7b >>84-32<<

D:/My Documents/projects/dave/test/should-print.txt
D:/My Documents/projects/dave/test/84-33 (Kland, Dan)/test.pl
D:/My Documents/projects/dave/test/84-33 (Kland, Dan)/test.pl~
D:/My Documents/projects/dave/test/84-33 Kland, Dan/test2.pl

=====  END OF OUTPUT  ======

It appears that the parentheses are being ignored.
The following names, produce the same results.
And, they never seem to eliminate the directory with the parentheses.

==  5a >>(?-xism:84\-33\ \(Kland\,\ Dan\))<<
==  5b >>84-33 (Kland, Dan)<<
==  6a >>(?-xism:84\-33\ Kland\,\ Dan)<<
==  6b >>84-33 Kland, Dan<<

Also, the following should not have excluded the directory "84-33 Kland,
Dan", but it did.
==  2a >>(?-xism:\(Kland\,\ Dan\))<<

So, there does seem to be something amiss.

Ken



_______________________________________________
Perl-Win32-Users mailing list
Perl-Win32-Users@listserv.ActiveState.com
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs

Reply via email to