> I have tried running both scripts without being able to reproduce the
> problem. But then I am running Perl 5.14.1 and File::Find::Rule version
> 0.33, so it could be version specific.
>
> I notice that the Changes file for the module has...
>
> 0.33 Monday 19th September, 2011
> Fixes the case where name("foo(*") hits an error with
> mismatched
> parentheis. Reported by Jan Engelhardt.
>
> It might be worth upgrading File::Find::Rule to the later version (Perl
> as well, if you can). It might make a difference.
>
> HTH
>
>
> --
> Brian Raven
>

Thank you both so much for testing this. Nice to know I'm not crazy or stupid - 
this time. I also realize I posted this to the win32 mailing list by mistake, 
so double thanks for helping out.

I've upgraded to version 0.33 and I'm getting better results with plain 
strings, so yes, the version was the precise issue. I still can't make it work 
reliably passing in qr// regular expressions though. I'm creating a module for 
somebody else who's just learning perl. I want them to be able to pass in plain 
strings to exclude directories with no need to escape meta characters but also 
wanted to give the option to pass in regular expressions in case that level of 
control might be needed. So the plain string part is working perfectly now with 
the upgrade. What I will do is create separate methods, one for plain strings, 
the other for regex strings and compile the latter in the back end as you do in 
your example.

Arvin


On Dec 13, 2011, Ken Slater <kl...@psu.edu> wrote: 

> -----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