| MAPPA | |||||||||
![]() |
Come esplorare il contenuto di una cartella in PERL.All´interno di una cartella possiamo trovare due tipi di oggetti:
Per rendere completa l´esplorazione della cartella sarebbe necessario esplorare il contenuto delle sottocartelle alla ricerca di eventuali ulteriori files e eventuali ulteriori sottocartelle e lo stesso procedimento si dovrebbe adottare per quest´ultime sottocartelle. Di fatto questa esplorazione è paragonabile all´esplorazione di un albero: non a caso la struttura delle cartelle nei filesystem più noti (FAT,NTFS,EXT2 per dirne alcuni anche se certamente non si esauriscono qui) è proprio ad albero. Gli approcci che vengono utilizzati di solito nei linguaggi procedurali sono di due tipi:
Si tratta di scegliere l´approccio più adeguato alla soluzione: in questo caso mi sembra che calzi di più l´approccio ricorsivo. L´idea di fondo è di creare due procedure:
La procedura files_figli
sub files_figli ($) {
my $cartella = shift;
my @files;
opendir(DIR,$cartella);
@files = grep{ -f "$cartella$_"} readdir(DIR);
#@files = grep{ /\.html$/ && -f "$cartella$_"} readdir(DIR);
closedir(DIR);
foreach (@files){
push(@listafiles,"$cartella$_");
}
}
La procedura cartelle_figlie
sub cartelle_figlie ($) {
my $cartellamadre = shift;
my @cartellefiglie;
opendir(DIR,$cartellamadre);
@cartellefiglie = grep {!/^\.+/ && -d "$cartellamadre$_" }
readdir(DIR);
closedir(DIR);
foreach (@cartellefiglie) {
next if (/^\./); # In realtà non servirebbe
&files_figli ("$cartellamadre$_$delim");
&cartelle_figlie("$cartellamadre$_$delim");
}
}
Il programma principale
$delim='\\'; # Parametro
@listafiles=(); # Variabile globale
$cartellainiziale='D:\\'; # cartella iniziale (radice)
&files_figli ($cartellainiziale); # Chiamo la sub files_figli
&cartelle_figlie("$cartellainiziale"); # chiamata ricorsiva;
foreach $f (@listafiles) {
print "$f\n";
}
|
||||||||
| |
|||||||||