Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

Searching file extensions

by Anonymous Monk
on Jun 19, 2003 at 11:23 UTC ( #267140=perlquestion: print w/ replies, xml ) Need Help??
Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

I need to search for all extension with:
html htm pl cfm
My search is working but the actual finding of file extenstions needs some work. Here is the part I have so far for searching .htm and .html files:
if( $_ =~ /\.html?$/)
#rest of my script here...all works okay

Comment on Searching file extensions
Select or Download Code
Re: Searching file extensions
by broquaint (Abbot) on Jun 19, 2003 at 11:30 UTC
    Not being able to spot a single question mark (bar the regex quantifier) I'm not sure what your question is, so here's some code to find extensions instead
    use File::Find::Rule; my @files = find( file => name => [ qw/ *.html *.htm *.pl *.cfm / ], in => @ARGV );
    This will recursively search for all files ending in html, htm, pl and cfm in all the directories in @ARGV and then assigning the the resulting list of filenames to @files. See. the ever-handy File::Find::Rule for more info.
    HTH

    _________
    broquaint

      My question is how can I put all four of the extensions in my search?
      if( $_ =~ /\.html?$/ or \.cfm/ or \.pl/)
      Basically get it to search for all four in my "if( $_ =~ /\.html?$/ or \.cfm/ or \.pl/)" part. I dont think I can put "or" in my search part so how else can I do it?
        A simple use of grouping and alternation should do the trick e.g
        print "$_ - ", ( /\.(?:html?|cfm|pl)$/ ? "yep" : "nope" ), "\n" for qw/ foo.pl bar.cfm baz.htm quux.xxx /; __output__ foo.pl - yep bar.cfm - yep baz.htm - yep quux.xxx - nope
        See. perlre for more info on regexes.
        HTH

        _________
        broquaint

Re: Searching file extensions
by Zaxo (Archbishop) on Jun 19, 2003 at 11:32 UTC

    You can do this with glob: my @files = glob '*.{html,htm,pl,cfm}';

    After Compline,
    Zaxo

Re: Searching file extensions
by crouchingpenguin (Priest) on Jun 19, 2003 at 12:10 UTC

    How about this (as an alternative to the File::Find answers)?

    #!/usr/bin/perl use strict; use warnings; use Data::Dumper; use constant RECURSIVE => 1; sub find_files_in_dir { my ($dir,@extensions) = @_; my $match = join('|',@extensions); opendir(DIR,$dir) or die $!; my @files = map { $_->{name} . '.' . $_->{extension}; } grep { $_->{extension} =~ m/\A(?:$match)\Z/o if $_; } map { my $file_with_dir = $dir . '/' . $_; if( -f $file_with_dir ){ { name => $1, extension => $2} if m/\A(.*?)\.(.*?)\Z/o; }elsif( RECURSIVE && -d $file_with_dir ){ map { {name => $1, extension => $2} if m/\A(.*?)\.(.*?)\Z/o; } find_files_in_dir($file_with_dir , @extensions ); } } grep { !m/\A(?:\.+)\Z/o } readdir(DIR); closedir(DIR); return @files; } my @files = find_files_in_dir( '.', qw( html pl pm ) ); print Dumper(\@files),"\n";

    Update: Added recursion


    cp
    ----
    "Never be afraid to try something new. Remember, amateurs built the ark. Professionals built the Titanic."
Re: Searching file extensions
by vek (Prior) on Jun 19, 2003 at 13:21 UTC

    You've already been given some good ideas about using File::Find::Rule so I though I'd point out something else you could try to find file extensions. You can also use File::Basename with your existing code:

    my ($name, $dir, $ext) = fileparse($filepath, '\..*');

    -- vek --
Re: Searching file extensions
by hardburn (Abbot) on Jun 19, 2003 at 13:53 UTC

    I had a similar problem a while back, which I solved with a dispatch table. Basically, this is a hash where the values are referances to subroutines. Example:

    my %DISPATCH = ( html => \&html, htm => \&html, pl => \&pl, cfm => \&cfm, ); $_ = '/path/to/file.ext'; $_ =~ /\.(\w+)\z/; $DISPATCH{$1}->($_, @other_args) if exists $DISPATCH{$1}; sub html { . . . } sub pl { . . . } sub cfm { . . . }

    ----
    I wanted to explore how Perl's closures can be manipulated, and ended up creating an object system by accident.
    -- Schemer

    Note: All code is untested, unless otherwise stated

      Why am I recieving the error message: Can't locate File/Find/Rule.pm in @INC It didn't seem to have any problem with File:Find

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://267140]
Approved by broquaint
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others lurking in the Monastery: (6)
As of 2014-10-21 21:59 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    For retirement, I am banking on:










    Results (111 votes), past polls