in reply to Finding un-paired files in a directory
Personally, I would use a different approach by restating the problem: You are interested in all *.mrg files that have no corresponding *.did file :
opendir DIR, $dir or die "Couldn't open directory '$dir' : $!"; my @files = grep { /(.*)\.mrg$/ and not -f "$dir/$1.did" } readdir DIR +; closedir DIR;
My method might be a bit slower, as for each .mrg file, an additional call to stat will be made, which can be very slow on full directories, but I think that the shorter code makes up for the slower code. If speed should really become an issue, I'd readdir the directories contents into a hash and then check for existence in the hash much like your example:
opendir DIR, $dir or die "Couldn't read '$dir' : $!"; my @all_files = map { lc $_ } readdir DIR; closedir DIR; my %did = map { /(.*)\.did$/ and ($1 => 1) } grep { /\.did$/ } @all_ +files; my @files = grep { /(.*)\.mrg$/ and not $did{$1} } @all_files;
Also, I don't think that production code should contain references to Perlmonks node IDs, but rather an explanation of what happens :
# return a list or a reference to an array, depending # on what the caller wants: return wantarray ? @files : \@files;
Update: Added "faster" alternative
Update 2: Fixed code in response to merlyns bugfinding
perl -MHTTP::Daemon -MHTTP::Response -MLWP::Simple -e ' ; # The $d = new HTTP::Daemon and fork and getprint $d->url and exit;#spider ($c = $d->accept())->get_request(); $c->send_response( new #in the HTTP::Response(200,$_,$_,qq(Just another Perl hacker\n))); ' # web
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
•Re: Re: Finding un-paired files in a directory
by merlyn (Sage) on Dec 02, 2003 at 12:13 UTC | |
by Coruscate (Sexton) on Dec 02, 2003 at 21:26 UTC |