Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

Re: Re: How do I recursively process files through directories

by dataking (Acolyte)
on Oct 04, 2003 at 22:52 UTC ( #296599=note: print w/ replies, xml ) Need Help??


in reply to Re: How do I recursively process files through directories
in thread How do I recursively process files through directories

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


Comment on Re: Re: How do I recursively process files through directories
Download Code
Re^3: How do I recursively process files through directories
by Aristotle (Chancellor) on Oct 04, 2003 at 22:59 UTC
    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://296599]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others about the Monastery: (13)
As of 2014-12-17 21:25 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    Is guessing a good strategy for surviving in the IT business?





    Results (34 votes), past polls