I want to read out a directory recursively to print the data-structure in an HTML-Page with Template::Toolkit. But I'm hanging in how to save the Paths and Files in a form that can be read our easy.
My idea started like this
sub list_dirs{
my ($rootPath) = @_;
my (@paths);
$rootPath .= '/' if($rootPath !~ /\/$/);
for my $eachFile (glob($path.'*'))
{
if(-d $eachFile)
{
push (@paths, $eachFile);
&list_dirs($eachFile);
}
else
{
push (@files, $eachFile);
}
}
return @paths;
}
How could I solve this problem?
You should always use strict and warnings to help you debug your code. Perl would have warned you for example that
@files
is not declared. But the real problem with your function is that you declare a lexical variable@paths
on every recursive call tolist_dirs
and don't push the return value back after the recursion step.If you don't want to install additional modules, the following solution should probably help you:
The answer by mdom explains how your initial attempt went astray. I would also suggest that you consider friendlier alternatives to
File::Find
. CPAN has several options. Here's one.Also see here:
SO answer providing CPAN alternatives to
File::Find
.SO question on directory iterators.
And here is a rewrite of your recursive solution. Things to note:
use strict
;use warnings
; and the use of a scoping block to create a static variable for the subroutine.I think you have problem in the following line in your code
You change the $path variable into $rootpath.
It will store the path correctly.
you can use this method as recursive file search that separate specific file types,
This should do the trick
I use this script to remove hidden files (created by Mac OS X) from my USB Pendrive, where I usually use it to listen music in the car, and any file ending with ".mp3", even when it starts with "._", will be listed in the car audio list.