Newsgroup: it.comp.lang.perl
Titolo: file in una directory

salve e buon natale a tutti!
volevo creare uno script che data una certa directory prenndesse i nomi di
tutti i file e li scrivesse tutti... come faccio???
il mio script è questo... che ho cercato di ricavare da qualche altro script
simile... ma non funziona...
...come output dà *.* ...qualcuno può aiutarmi???
#!/usr/bin/perl
print "Content-type: text/html\n\n";
@files = ('*.*');
print "@files\n";
grazie mille
Francesco

 
 perldoc -tf opendir
 perldoc -tf readdir



Ciao Francesco,
puoi provare questo script da me scritto, e' molto rudimentale ma
funziona:
open (CURRDIR,"/wwwroot");
# al posto di /wwwroot metti la directory che vuoi esplorare
@content=<CURRDIR>;
close (CURRDIR);
print "Content-type: text/html\n\n";
print ("<HTML>\n");
print ("<HEAD>\n</HEAD>\n");
print ("<BODY BGCOLOR=#EEEFBD>\n");
print ("<FONT FACE=VERDANA size=2 COLOR=#404040>\n");
while ($content[$count]) {
$count++;
print "$content[$count]<br>";
			}
print ("</BODY>\n</HTML>");

 wrote:

E' normale che ti dia *.* come output.
no, se vuoi solo uno script che data una certa directory
prende i nomi dei file e li scrive, ti basta un semplicissimo
#!/usr/bin/perl
$percorso=<STDIN>;
@files=`ls $percorso`;
print @files;
Spero che fosse questo ciò che cercavi.
BYEZZZZZZzzzz.........
-- 
aSs0  -  
mastr...@bigfoot.com
  -  ICQ UIN  #21746800  
Mi  fidavo di lei  come un giocatore nella sua miglior
        				combinazione.]

 print @files;
Personalmente non mi piace usare chiamate a comandi di shell se non 
indispensabili. Si puo' usare benissimo:
opendir(DIR,"$persorso");
@files=grep !/^\./,readdir DIR;
closedir DIR;
Nota: il grep toglie i file che iniziano per punto, ma si puo' benissimo 
togliere o sostituire.
-- 
Saluti,
Giancarlo

Mi dispiace che si discuta questo post dopo un bel po' di tempo, visto che
e' del 24 Dic !
Bene, partecipo ugualmente:
Devo dare ragione (parzialmente) al collega Giancarlo Bissio:
@files=`ls $percorso`; non e' indipendente dal OS, su Dos ad esempio
restituirebbe: "Comando o nome di file non valido".
Quindi e' chiaro che bisgna trovare una alternativa e non usare la shell :
Giancarlo propone:
opendir(DIR,"$persorso");
@files=readdir DIR;
closedir DIR;
A questo punto, credo che Giancarlo abbia perso di vista l'obbiettivo
principale :
Qunado colui che ha postato la domanda scrive: @files = ('*.*'); e' chiaro
che voglia mettere ogni file nel array @files. E' chiaro anche che si
aspetta magari che un @files = ('*.txt'); metta invece tutti i files. txt.
Inoltre non sembra interessato a specificare il path, sembra che voglia piu'
semplicemente lavorare sulla working directory.
E' chiaro che l'accoppiata opendir, readdir, closedir oltre ad occupare 3
righe sia MOLTO scomoda per sciegliere quale estensioni prendere (Giancarlo
propone un grep !!!).
Mi pare ovvio che la risposta piu' breve, e migliore sia:
@files=glob("*.*");
Tale risposta al contrario di quella di aSs0 e' OS independent (non usa la
shell). E al contrario di quella di Giancarlo e' su una riga sola, molto
semplice, e permette in modo MOLTO semplice di specificare l'estensione. In
altre parole unisce le caretteristiche migliori di entrambi i tentativi.
Anche se in tale caso si ricorre spesso ad opendir, volendo e' possibile
specificare anche un path. @files=glob("./una_dir/*.txt"); (l'array
conterra' pero' il nome del file preceduto dal path, e non solo il nome del
file !!!)
Molti avranno visto usare @files=<*.txt>; e' piu' o meno la stessa cosa. (si
usava, ma ora si preferisce glob)
Ecco che @files=glob("*.txt"); mette nel array @files tutti i files con
estensione txt.
In sostanza oltre al motto TMTOWTDI (che rimane valido) aggiungerei KIS che
significa Keep It Simple, ovvero usa TMTOWTDI e di tutti metodi che ti vengo
no in mente prendi solo quelli piu' semplici ed immediati !!!
Per concludere vedendo @files = ('*.*'); mi sembra evidente che clui che ha
fatto la domanda si e' semplicemente dimenticato di scrivere glob davanti
alla tonda :
@files = glob('*.*');     # Perfettamente corretto !!!
Alex


usava, ma ora si preferisce glob)
qual'e' il vantaggio ?
-- 
     #@@@ missinglink on slackware 7.1 ###
     ####       member of telug        #@@
 

qual'e' il vantaggio ?
se digito il nome del file, beh, all'apparenza nessuno, ma se voglio usare
una variabile:
$exts="*.*";
@file=<$exts>;      # NON FUNZIONA, bisogna mettere le graffe !!!
@file=<${exts}>;     # QUESTA FUNZIONA !!!
Ovviamente e' molto piu' pulito scrivere:
@file=glob($exts);
Glob supporta i doppi apici (per l'interpolazione con variabili), gli apici
(senza interpolazione) e persino variabili pure.
Spero di essere stato chiaro,
Alex

 principale :
Credo proprio di no.
Io sapevo che l'obbiettivo e' scrivere programmi efficienti e non fosse 
quello di rispiarmare sulle righe di codice.
Vediamo i risultati di un piccolo test:
- Caso 1
Codice:
@files=glob("*");
print scalar @files,"\n";
Linea di comando:
time perl 
files.pl
Output (4 eseguzioni):
4612
perl 
files.pl
  0.12s user 0.11s system 107% cpu 0.214 total
4612
perl 
files.pl
  0.09s user 0.11s system 99% cpu 0.201 total
4612
perl 
files.pl
  0.10s user 0.09s system 102% cpu 0.186 total
4612
perl 
files.pl
  0.11s user 0.07s system 98% cpu 0.182 total
Caso 2
Codice:
opendir(DIR,".");
@files= grep !/^\./, readdir DIR;
closedir DIR;
print scalar @files,"\n";
Linea di comando:
time perl 
files.pl
Output (4 eseguzioni):
4612
perl 
files.pl
  0.04s user 0.04s system 100% cpu 0.079 total
4612
perl 
files.pl
  0.05s user 0.03s system 113% cpu 0.071 total
4612
perl 
files.pl
  0.03s user 0.04s system 96% cpu 0.073 total
4612
perl 
files.pl
  0.04s user 0.03s system 96% cpu 0.073 total 
Ovviamente i due casi sono stati testati sulla stessa macchina, con lo 
stesso OS, sulla stessa directory (volutamente "abbastanza popolata")  
So benissimo che time non e' un benchmark fantastico, comunque a voi le 
debite conclusioni.
-- 
Saluti,
Giancarlo

debite conclusioni.
In conclusione se dovessi fare un CGI che elenca i contenuti di piu'
directory con moltissimi files allora userei readdir, se devo elencare il
contenuto di una sola directory con una quantita' normale di files allora
uso glob !
Perche' non usi il C per fare i CGI, oppure l'assembler per fare programmi ?
Perche' e' vero che la velocita' e' importante, ma anche avere codice pulito
e semplice. (e nel caso dei CGI poterli modificare senza dover prendere il
sorgente e poi ricompilarlo).
Insomma se devi avere prestazioni da urlo abbandoni il C ed usi Assembly, ma
altrimenti KIS, keep it simple !
Non sto dicendo che se devi ottimizzare il codice devi farlo passando al C !
Era solo un'esempio!
Quello che voglio dire  e' che  dipende dsolo a cio' che vuoi ottenere. Se
devi riportare i una quantita' enorme di files non posso fare altro che
darti ragione.
Alex

 ma altrimenti KIS, keep it simple !
Non so, se questo
opendir(DIR,".");
@files= grep !/^\./, readdir DIR;
closedir DIR;
e' codice complicato.....
-- 
Saluti,
Giancarlo

anche senza.
Guarda che l'astrazione e' una delle prerogative principali del Perl (e
dell'informatica).
Io sono un programmatore di C/C++ e il perl mi e' diventato simpatico per la
sua semplicita' (rimanendo molto piu' rigoroso di VB pero' :-)) e per la sua
somiglianza ad un linguaggio naturale. Inoltre e' molto valida la concezione
dei contesti.
Insomma non e' ingoranza e' astrazione !!!
Se vogliamo essere onesti nemmeno con l' opendir, l'handle etc... non
capisci realmente come funziona, questo fino a che non leggi i sorgenti di
un sistema operativo e/o non ti implementi la cosa in assembly ! (dimmi
usando un handle cosa hai capito ???)
La programmazione si basa su astrazioni, e meno male, una volta si
programmava con contatti elettrici, e quella era programmazione reale !!!
Per fortuna sono nate le macchine a piu' livelli, con sistemi operativi
etc... Chi programma in C usa un alto livello di astrazione !
Alex
P.S. Il discorso delle prestazioni lo trovo un discorso valido ! Ti ho dato
ragione, solo che non mi sembrava di fondamentale importanza per leggere una
decina di files da una dir.
Ora pero' questo discorso dell'ignoranza mi sembra eccessivo e sbagliato !!!

 leggere una decina di files da una dir.
Pero' chi lo aveva detto che i file da leggere erano solo una decina? non 
sapendolo e' meglio un codice "multi-purpose" che funziona bene in uno 
spettro il piu' possibile ampio di casi.
-- 
Saluti,
Giancarlo

@files = glob('*.*');     # Perfettamente corretto !!!
Doh! Non ci avevo pensato. Sono abituato ad usare le parentesi acute < > e
quindi non mi era passato nemmeno nell'anticamera del cervello che avesse
dimenticato di scrivere glob. :)
CIAO!
BYEZZZZZZZzzz......


spettro il piu' possibile ampio di casi.
Hai ragione, nessuno aveva detto che la richiesta di aiuto era per un 
sistema Linux e nessuno aveva detto che il numero di file da listare 
fossero una decina. Io presonalmente ho dato una delle (tante) soluzioni
applicabili, tu ne hai data un'altra e Alex un'altra ancora. A prescindere
da quale fosse la piů corretta (e benintesto che *NON* era la mia) penso che
tu abbia esasperato un po' i toni...
Ciao 
BYEZZzz.........


Spero di essere stato chiaro,
molto, grazie


 
Io avrei "esaperato" i toni????
Vabbe' stavo scrivendo un post enorme, ma lascio stare e' OT e avrei 
veramento "esaperato i toni".....
-- 
Saluti,
Giancarlo