http://www.perlmonks.org?node_id=1021016


in reply to Using File::Find

find ( thats exported by File::Find ) requires you to define a function that will be used to pick files that you are want. Basic usage like so:

use strict ; use warnings ; use File::Find; use Data::Dump; my $dir = shift || die "Dir name missing as argument\n"; my @files = (); find( \&wanted, "$dir" ); dd( \@files ) ; exit() ; sub wanted() { push @files, $File::Find::name if(/\.txt$/i); # .txt or whatever. }

Replies are listed 'Best First'.
Re^2: Using File::Find
by arnaud99 (Beadle) on Feb 28, 2013 at 08:52 UTC

    Hi

    Another option, and possibly a simpler one for someone new to perl is to use File::Find::Rule. The example below searches through the current directory and its subdirectories, for all files with a .pl extension.

    Note that the result is stored in an array, not a hash. The result can be stored in a hash if the user needs to, but the key/value construct would need to be understood eg, is the key the path, and the value the file name, or is the key the full file name and the value the size of the file (or other attributes) etc....

    use strict; use warnings; use autodie; use File::Find::Rule; my @txt_files = File::Find::Rule ->file ->name('*.pl') ->in('./'); foreach (@txt_files) { print "$_\n"; }

    I hope this helps

    Arnaud.
Re^2: Using File::Find
by Dr Manhattan (Beadle) on Feb 28, 2013 at 08:54 UTC

    Thank you for the reply. I tried this:

    #!/usr/bin/perl -w use strict; use warnings; use File::Find; use Cwd; my $dir = getcwd; my %hashTS; find(&wantedTS, "$dir"); sub wantedTS() { if ($File::Find::name =~ /(.*)(\.ts)(\.txt)$/) { $hashTS{$File::Find::name}++; } }

    to place text files ending with .ts.txt into my hash, but it doesn't work because "Use of uninitialized value $File::Find::name"

      You're missing a backslash...

      find(\&wantedTS, "$dir");
      package Cow { use Moo; has name => (is => 'lazy', default => sub { 'Mooington' }) } say Cow->new->name