MAPPA      

Valid HTML 4.01!

Google
Web Sito
 
torna alla sezione Perl

PERL

Practical Extraction and Report Language
Perl

Come esplorare il contenuto di una cartella in PERL.

All´interno di una cartella possiamo trovare due tipi di oggetti:

  1. I files;
  2. Le sottocartelle;

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:

  1. approccio iterativo.
  2. approccio ricorsivo.

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:

  1. files_figli Che generi tutti la lista di tutti i files figli di una certa cartella.
  2. cartelle_figlie Che generi la lista di tutte le directory figlie e per ognuna di esse rilanci le due procedure Files_figli e Cartelle_figlie.

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

  

torna alla sezione Perl