in reply to Re: File::Find pattern match question
in thread File:Find pattern match question

ok tried your example and it doesn't print anything out, if I remove the pattern matching requirement it does work but obviously shows me all directories

#!/usr/bin/perl # dirpath use strict; use warnings; use File::Find; use Fcntl; #*****************Path Variables********************** our $wellpath = 'N:\\repos\\open\\Wells\\Regulated\\'; our $surveypath = 'N:\\repos\\open\\Surveys\\Regulated\\'; our $testpath = 'C:\\Temp\\'; #******************************************************* my %dirs; find(\&dir_names, $testpath); print "$_\n" for sort keys %dirs; sub dir_names { # skip over everything that is not a directory return unless -d $File::Find::name; # skip over directories that don't match required pattern return unless $File::Find::dir =~ /[IPD]\d{8}$/; $dirs{$File::Find::dir} = 1; }

Replies are listed 'Best First'.
Re^3: File::Find pattern match question
by Athanasius (Cardinal) on Nov 01, 2013 at 02:22 UTC

    According the the documentation for File::Find:

    The wanted function takes no arguments but rather does its work through a collection of variables.

        $File::Find::dir is the current directory name,
        $_ is the current filename within that directory
        $File::Find::name is the complete pathname to the file.

    The above variables have all been localized and may be changed without affecting data outside of the wanted function.

    So this line:

    return unless $File::Find::dir =~ /[IPD]\d{8}$/;

    is actually testing the parent directory, not the current file. Better to run both tests against the current filename in $_:

    sub dir_names { return unless -d $_; return unless $_ =~ /[IPD]\d{8}$/; $dirs{$File::Find::name} = 1; }

    or just:

    sub dir_names { return unless -d; return unless /[IPD]\d{8}$/; $dirs{$File::Find::name} = 1; }

    I think that fixes the problem.

    Hope that helps,

    Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

      Works perfectly! :-) Thank you very much! Cheers