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
In reply to Re: Finding un-paired files in a directory
by Corion
in thread Finding un-paired files in a directory
by inman
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |