Beefy Boxes and Bandwidth Generously Provided by pair Networks
XP is just a number
 
PerlMonks  

Re: How do I recursively process files through directories

by Mork29 (Scribe)
on Aug 07, 2003 at 12:10 UTC ( #281852=note: print w/ replies, xml ) Need Help??


in reply to How do I recursively process files through directories

Did anybody else notice that the great paco has returned! or he had at least. He was listed as logging in as recently as July 11, 2002! Did paco loose that hot dog vendor job and decide to give Perl another shot? Did he see his new found reputation and get scared back away? This mystery shall never end...


Comment on Re: How do I recursively process files through directories
Re: Re: How do I recursively process files through directories
by softworkz (Monk) on Aug 25, 2003 at 15:19 UTC
    I see that Mork29, Paco sure is an elusive fella!
Re: Re: How do I recursively process files through directories
by dataking (Acolyte) on Oct 04, 2003 at 22:52 UTC

    OK, an additional question from another perl n00b. My search basically turned up this thread. So...

    Anyhow, how do you get what File::Find *finds* into a list (array) for further processing?

    The following code snippet only prints the list of files to STDOUT, but doesn't dump them into @stuff. What am I doing wrong?


    Code:
    #!/usr/bin/perl use strict; use warnings; use File::Find; use MP3::Mplib; + print "Enter the full path of your MP3 directory:\n"; my $mp3_dir = <STDIN>; chomp($mp3_dir); + my @stuff = find(\&wanted, $mp3_dir); + foreach my $item ( @stuff ) { my $mp3 = MP3::Mplib->new($item); my $v1tag = $mp3->get_v1tag; my $v2tag = $mp3->get_v2tag; + while (my ($key, $val) = each %$v1tag) { print "$key\: $val\n"; } while (my ($key, $val) = each %$v2tag) { print "$key\: $val\n"; } } + sub wanted { print "$File::Find::name\n" if -f && ! -d && m/\.mp3$/i; }
      You have to put them where you want them. In your example that would be
      my @stuff; sub wanted { push @stuff, $File::Find::name if -f && ! -d && m/\.mp3$/i; } find(\&wanted, $mp3_dir);
      or better
      my @stuff; find(sub { push @stuff, $File::Find::name if -f && ! -d && m/\.mp3$/i; }, $mp3_dir);
      Except it isn't better, since all you're doing is to process them one by one. So do it right in the callback function:
      find(\&wanted, $mp3_dir); + sub wanted { return unless -f && ! -d && m/\.mp3$/i; print "$File::Find::name\n" my $mp3 = MP3::Mplib->new($item); my $v1tag = $mp3->get_v1tag; my $v2tag = $mp3->get_v2tag; + while (my ($key, $val) = each %$v1tag) { print "$key\: $val\n"; } while (my ($key, $val) = each %$v2tag) { print "$key\: $val\n"; } } +
      Update: That should be push @stuff, $File::Find::name, not push @stuff, $_, otherwise you loose the path.

      Makeshifts last the longest.

        Thanks for the post. The first suggestion actually worked well. I want to do a lot more here (as you might be able to imagine) than just print the MP3 ID(v1|v2) tags. So it is *handy* to have the entire file list available as an entity.

        Thanks, again.

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others surveying the Monastery: (3)
As of 2014-09-15 04:08 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite cookbook is:










    Results (145 votes), past polls