Newsgroup: it.comp.lang.perl
Titolo: stampare DIR

Ciao a tutti, sono alle prime armi volevo sapere come stampare il contenuto
di una directory. Grazie anticipatamente

 di una directory. Grazie anticipatamente
Con readdir: 
http://www.perl.it/documenti/perlfunc/view.html?id=103
Consulta anche opendir e closedir.

 di una directory. Grazie anticipatamente
opendir(HOMEDIR, $ENV{HOME});
my @files = readdir(HOMEDIR);
closedir HOMEDIR;
foreach (@files) {
  print STDOUT $_,"\n";
  }
# Invece di $ENV{HOME} puoi metterci la tua directory $MyDir
# Occhio che ti lista anche i subfolders e ".","..".
 Raffaello

 ha scritto nel messaggio
news:Pine.OSF.4.31.04051...@harry.molgen.mpg.de...

io volevo stampare il contenuto di una directory ad esempio che ha come
percorso il seguente: c:\programmi
questo codice puň andare bene scritto cosě?
opendir(HOMEDIR, $c:\programmi});


 opendir(HOMEDIR, $c:\programmi});
Il sig. Galli penso intendesse $MyDir come variabile. Quindi la riga qui
sopra diventerebbe:
$MyDir = "C:\\Programmi"; # la doppia \ serve!
# Becchiamo anche l'errore!
opendir(HOMEDIR, $MyDir) or die "Can't open $myDir: $!\n"; 
Ciao,
-- 
+--------+ | ASCII ribbon campaign ( ) | 
www.autistici.org/kral
|  kral  | |  - against HTML email  X  |
+--------+ |              & vCards / \ | my key id = 0x7C946947

 ha scritto nel messaggio
news:20040510172509.000055f6@PC_MARCO...

scusate ma cosa ha questo listato di sbagliato?
#!/usr/local/bin/perl
print STDERR "Quale directoy devo stampare?";
$MyDir=<STDIN>;
opendir(HOMEDIR,"$MyDir");
my @files = readdir(HOMEDIR);
closedir HOMEDIR;
foreach (@files) {
  print STDOUT $_,"\n";
  }
potete cortesemente commentare le ultime 5 righe?

 opendir(HOMEDIR,"$MyDir");
Qui se tu avessi intercettato l'errore, avresti capito che era l'open
che falliva. Quindi è sempre buona norma utilizzare l'or ( si può usare
anche ||, ma bisogna stare attenti a quando la funzione ritorna qualche
valore!) per capire anche dove l'errore avviene.
Io ripeto il mio consiglio (anche se parlo bene, ma razzolo male) di
studiare bene le basi del perl. Il top sarebbe comprare un buon libro,
ma vanno bene anche alcuni tutorial in rete.


 # Occhio che ti lista anche i subfolders e ".","..".
Scusate se mi intrometto, ma la readdir mette sempre "in cima" all' array
"." e ".."?
-- 
§          ZeD           §
§     Up da 1:58 ore     §
§       10/05/2004       §
§ S. Antonino-S. Cataldo §

 array"." e ".."?
Se stai pensando di fare un doppio pop sull'array, dovrebbe essere
giusto. Tuttavia, così come consigliato da perldoc -f readdir, è meglio
a mio avviso usare la funzione grep (perldoc -f grep).
Tipo:
 my @files = grep !/^\.+$/, readdir DIR or die "Can't read $dir: $!\n";
Anche perché con la grep si possono fare più filtri alla volta e quindi
è più versatile, imho.
my 2 cents,


 giusto.
Scusate,
al doppio shift sull'array.
Ciao,


> opendir(HOMEDIR,"$MyDir");
Aggiungiamo che non ha un gran senso interpolare $MyDir, e che un
controllino non ci starebbe male, visto che la directory è inserita
dall'utente.
Così è un po' più carino:
   opendir(HOMEDIR,$MyDir) or die;
Ciao.

 Aggiungiamo che non ha un gran senso interpolare $MyDir
Non volevo essere _troppo_ rompiballe! :)


 opendir(HOMEDIR, $MyDir) or die "Can't open $myDir: $!\n";
In effetti l'error handling e' d'obbligo.
 Raffaello

 ha scritto nel messaggio
news:20040511085115.00002b36@PC_MARCO...

scusate ragazzi ma la domanda postatavi era quella di commentarmi le ultime
5 linee di codice(sempre con gentilezza ).vi ringradio anticipatamente

 anticipatamente
Penso che una lettura _completa_ del thread ti possa dare un quadro
abbastanza completo sull'utilizzo delle funzioni opendir, readdir,
closedir, che cmq non sono tra le funzioni più difficili da capire.
Oltretutto, perldoc è abbastanza esaustivo riguardo queste funzioni.
Il mio consiglio a questo punto è quindi RTFM, nel senso di: Read The
Fine Manual.


 writes:
kral> [ZeD 10/05/04 - 20:35]:
    > > Scusate se mi intrometto, ma la readdir mette sempre
    > > "in cima" all' array"." e ".."?
in questo newsgroup circa il 70% (ossia piu` della meta`) dei
post di risposta contiene inesattezze,
esorto  -per il bene di tutti-  coloro che rispondono, a scrivere
regexp e funzioni solo se sono piu` che esperti di quando stanno per
scrivere pubblicamente, altrimenti e` meglio che neanche vengano date
risposte perche` la documentazione e` fatta molto bene.
la &readdir di perl chiama la readdir() di libc o simile libreria (determinata
in fase di ./configure) che fa una corrispondente system call
(v. Linux: kernel/fs/readdir.c  oppure
    BSD: /usr/src/lib/libc/gen/readdir.c /usr/src/sys/lib/libsa/readdir.c),
la filosofia unix e` di non compiere operazioni bacate/omaggio aggiunte
ad una precisa richiesta, se queste possono essere inutili (come ad esempio
il sort del contenuto della directory), quindi potete stare
tranquilli che . e .. sono in prima posizione.
e` ovvio cosi` che la risposta alla domanda e` nell'organizzazione del
file system, nella maggior parte dei filesystem unix [credo tutti] (minix,
ext, nfs, ...),  le dir "." e ".." sono sempre le prime due entry di tutte le
directory (e se non e` gia` nel filesystem e` l'iterfacciamento di mount
che le predispone appendendo al . e .. della directory esistente su cui e`
fatto il mount (es. mount di vfat, la home non avrebbe . e .. nel fs)).
Il modo piu` efficiente per ignorare . e .. e` cosi`:
opendir(DIR,"$dirname") or die "can't opendir $dirname: $!";
$fixed_skip_dir_pos && seekdir(DIR,$fixed_skip_dir_pos) or    # ignore . and ..
 do{for(0..1){readdir(DIR)};$fixed_skip_dir_pos=telldir(DIR)} # by MARco
kral> Se stai pensando di fare un doppio pop sull'array,
kral> dovrebbe essere giusto.
sul pop ti sei corretto da solo, ma ti e` rimasto un errore sul grep
kral> Tuttavia, cos.ì come consigliato da perldoc -f readdir, .è meglio
kral> a mio avviso usare la funzione grep (perldoc -f grep).  Tipo:
kral>  my @files = grep !/^\.+$/, readdir DIR or die "Can't read $dir: $!\n";
la !regexp giusta e` !/^\.\.?$/, quella di esempio a &readdir ignora
bene anche qualunque file che comincia con . infatti quelli si chiamano
hidden files. a te son rimasti gli hidden file "..." "...." ecc.
Non e` pignoleria c'e` anche un programma che crea automaticamente una
directory "...", e se la maggior parte del codice e` scritto con
copia/incolla, andiamo bene se il tasso di errori e` 1 errore subdolo
per riga. (il perl e` cosi` complesso che se e` usato superficialmente
un errore subdolo ogni 10 righe e` la norma).
kral> Anche perch.é con la grep si possono fare pi.ù filtri alla volta e
kral> quindi .è pi.ù versatile, imho.
se fosse giusto ...
inoltre scomodare una doppia allocazione di un set di stringhe
potrebbe essere un po' pesante solo per escludere le prime due voci.
Sono intervenuto perche` la corrente dei paranoici (in senso informatico),
ha una derivazione anglosassone precedente a 
paranoici.org
, non significa
cretini, paranoid e` legata alla sicurezza, la sicurezza e` sapere _tutto_,
ma dato che e` impossibile sapere tutto, cio` che non si sa, fintanto
che non lo si approfondisce, determina un insieme infinito ma logicamente
valido di sospetti/dubbi/ipotesi inpensabili ai piu`, e questi hanno
quell'apparenza paranoica, che non dovrebbe essere di accezione negativa.
Cioe` ad esempio io vorrei potermi dire simpaticamente paranoid
in contesto informatico senza l'onere di dover temere di essere frainteso.
Saluti,
MARco
-- 
 
http://mar.i.am/~u16544.49365/it.comp.lang.perl,skipdir..
.,it
x(t),y(t) = th(3t-34.5)*e^[-(3t-34.5)^2]/2-4.3+e^(-1.8/t^2)/(.8*atg(t-
3)+2)(t-1.8)-.3th(5t-42.5),(1.4e^[-(3t-34.5)^2]+1-sgn[|t-8.5|-.5]*1.5*
|sin(pi*t)|^[2e^(-(t-11.5)^2)+.5+e^(-(.6t-3.3)^2)])/(.5+t)+1  ; 0<t<14

 potrebbe essere un po' pesante solo per escludere le prime due voci.
Qui non ho ben capito, può farmi un esempio? 
(Anche perché la stessa documentazione fa una grep con due filtri).
 
Grazie dell'eventuale spiegazione,


 negativa.
So che le risposte che a volte si danno non sono il top della
correttezza o dell'efficienza, ma si è qui per crescere insieme, imho.
La rigrazio cmq delle puntualizzazioni che ha fatto e degli eventuali
successivi approfondimenti. In fondo sono qui anch'io per imparare (come
molti qui dentro, credo) e mi fa piacere quando trovo qualcuno più
_paranoico_ di me.
alla prossima,


 > ecc. 
In effetti dopo averci pensato un pò, la regexp da me proposta
(!/^\.+$/), esclude eventuali file/dir "...", "....", etc... . E' in
effetti un caso a cui non avevo pensato, essendo anche, per mia
esperienza, un caso abbastanza raro che però va considerato. Come soleva
ripetermi un ing. con cui ho lavorato, "Perdere un dato o perderli tutti
è la stessa cosa". Quindi la regexp giusta è quella proposta dal sig.
Usenet MARco 16544.49365:
  grep !/^\.\.?$/, readdir( DIR ) or die °$!\n";
Ciao,


directory "..."
Temo che, su Window2000, avrebbe qualche difficoltà a farlo ma, certo,
*qualcuno* potrebbe pure riuscirci.
Ciao.
[1] 
http://xoomer.virgilio.it/giozezza/cospirazioni.html

 post di risposta contiene inesattezze,
Puo' darsi, forse anche piu' del 70%.
I newsgroup non sono fatti per diffondere la
Verita' Scientifica Assoluta (ammesso che
esista).
Nei newsgroup c'e' qualcuno che fa delle
domande sintetiche e qualcuno che risponde
sinteticamente e solitamente _in_fretta_.
Sintesi implica incompletezza, ergo inesattezza.
Per quanto mi riguarda leggo i NG quando ho tempo,
tra un meeting e un backup, o tra il pranzo e il
caffe'.
Non posso e non voglio dare risposte esaustive perche'
questo mi prenderebbe troppo tempo (a parte che Google
potrebbe rispondere a quasi tutte le domande che
vengono fatte in molti NG), e penso che la stragrande
maggioranza degli utenti faccia lo stesso.
Ti invito ad un atteggiamento piu' tollerante e
amichevole.
 Raffaello

 ha scritto nel messaggio
news:Pine.OSF.4.31.040512...@harry.molgen.mpg.de...

Scusate raga' ma la seguente stringa cosa vuol dire in particolare i
simboli(_,)
la stringa č:
print STDOUT $_,"\n";

 print STDOUT $_,"\n";
print STDOUT stampa sul terminale (se l'handle STDOUT non e' definito
diversamente) tutti i valori che seguono.
Nel caso in questione i valori che seguono sono
$_  e  "\n"
Sono separati da una virgola come hai notato.
$_ e' una variabile speciale che contiene il risultato dell'ultima
funzione chiamata (si potrebbero dare molti dettagli a riguardo,
ti invito ad approfondire nei manuali o su google).
"\n" e' il ritorno-a-capo.
Prova a giocare un po' con il codice "per vedere l'effetto che fa" ... ;)
Di solito e' un buon modo per imparare. Anche leggere i manuali non
fa male (RTFM).
 Raffaello


Scusate ma io sono proprio un principiante. Forse a voi farà ridere ma io
avrei risposto:
print `dir c:\\programmi`;
oppure
print `ls -l \/home`;
Potete spiegarmi brevemente perchè ho detto una stupidaggine tremenda?
ciao

 Potete spiegarmi brevemente perchè ho detto una stupidaggine tremenda?
Non è una stupidaggine tremenda, è solo meno portabile di opendir,
readdir, etc. :^)
Ciao,
-- 
+--------+ | ASCII ribbon campaign ( ) | 
www.autistici.org/kral
|  kral  | |  - against HTML email  X  |
+--------+ |              & vCards / \ | my gpg id = 0x7C946947

 Potete spiegarmi brevemente perchè ho detto una stupidaggine tremenda?
Perché non è detto che tu abbia a disposizione un comando "ls" o un
comando "dir" sulla macchina su cui gira il programma Perl.
Ciao,
 Emmanuele.
-- 
Emmanuele Bassi (Zefram)                 [ 
http://www.emmanuelebassi.net
 ]
GnuPG Key fingerprint = 4DD0 C90D 4070 F071 5738  08BD 8ECC DB8F A432 0FF4