Newsgroup: it.comp.lang.perl
Titolo: HelpeMe

Scusatemi se vi pongo una domanda cosě banale, ma sto cercando di
imparare il perl..
1)Ho realizzato un programma (banalissimo!) che mi consente di accedere
ad un file e stampare a video il contenuto... un altro che mi consente
di aprire una directory e di stampare a video il contenuto.. Adesso sto
cercando di realizzare un proggy che mi consenta di leggere il contenuto
di una directory e di stampare il risultato in un file (indicato con
un'interazione proggy-utente)... ma come si puň intuire non mi funziona!
Qual č l'istruzione corretta??
..riesco a far stampare a video il contenuto della directory ma non mi
trasferisce il contenuto nel file indicato..
2)Un'altra cosa.. questo qui sotto č un programma x la copia del
contenuto di un file in un altro:
------------
use File::Copy;
$dir = "c:\\documenti\\primo.txt";
$dir2 = "c:\\documenti\\vuoto.txt";
copy ("$dir","$dir2");
-------------
Bisogna utilizzare i blackslash per farlo funzionare... ma non c'č il
modo di inserire da input es. : "documenti", "primo.txt", "secondo.txt"
???
Ho provato a trasformarli in variabili.. ma non mi compaiono i
blackslash! :-(
(es.  $dir="c:\\$a\\$b" --> con "a" e "b", inserite da tastiera)
Vi ringrazio anticipatamente... alla prox!E scusatemi x il disturbo...
;-)
(importante: utilizzo il perl con windows)
dany
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 (importante: utilizzo il perl con windows)
si notava.
Ciao.
-- 
-- Marco Allegretti --
http://www.shishii.com

 Ciao.
perchč?!non č buono windows?! cmq, ti ringrazio shishii... non mi
riferivo a quello! il proggy che realizza una copia di un file in un
altro ero riuscita a farlo..
ti porto un esempio:
ipotizziamo che voglia stampare il contenuto di c:\windows\system
in c:\documenti\miofile.txt
Si puņ fare?!perchč a me non da nessun risultato!
Grazie di nuovo per la tua prima risposta!
Ciao.


 in c:\documenti\miofile.txt
prova:
my @tutti_i_file;
my $directory='c:\windows\system';
my $file='c:\documenti\miofile.txt';
opendir DIR, "$directory" or die "Non posso leggere $directory";
@tutti_i_file=readdir DIR;
closedir DIR;
open (FILE,">$file") or die "Non posso scrivere $file";
foreach (@tutti_i_file) {print FILE "$_\n"}
close(FILE);

 Si può fare?!perchè a me non da nessun risultato!
Proviamo cosi:
#------------------------------------------------------------------
print "Directory: ";            my $dir = <STDIN>;    chomp $dir;
print "File Destinazione: "; my $file = <STDIN>;   chomp $file;
open DIR, $dir or die "$!";
my @files = readdir(DIR);
close DIR;
@files = grep {$_ ne '.' && $_ ne '..'} @files; # rimuovi questa linea se
vuoi anche i puntini
my $files = join "\n", @files;
open FH, ">$file" or die "$!"
print FH $files;
close FH;
print "Ok"; <stdin>;
#------------------------------------------------------------------
---
Mario Rizzuti

 close DIR;
opendir DIR, $dir or die "$!";
my @files = readdir(DIR);
closedir DIR;


Innanzitutto, "grazie" a tutti..
sono riuscita a realizzare il programma di visualizzazione e stampa del
contenuto di una directory in un file di testo(seguendo i vostri
consigli).
Funziona! 
x Mario:
il proggy l'ho realizzato cosě, ma la funzione grep non mi funziona! non
mi elimina i puntini!?xkč!?dove sbaglio?
-------------
my @allfile;
my $A="c:\\$dirprinc\\$subdir";
my $B="c:\\$dirprinc2\\$subdir2";
opendir DIR, "$A" or die "Non posso leggere $A";
@allfile=readdir DIR;
closedir DIR;
# rimozione dei puntini dalla stampa
@allfile = grep {$_ne "." && $_ne ".."  } @allfile;
open (FILE,">$B") or die "Non posso scrivere $B";
foreach (@allfile)  { print FILE "$_\n" }
close (FILE);
-------------------
Grazie di nuovo a tutti..
Ciao ciao


 -------------------
Un'osservazione: a che serve mettere tutto in un file per poi scorrere 
il file uno ad uno? e' meglio scorrere direttamente il dirhandle
my $A="c:\\$dirprinc\\$subdir";
my $B="c:\\$dirprinc2\\$subdir2";
opendir DIR, "$A" or die "Non posso leggere $A: $!";
open (FILE,">$B")  or die "Non posso scrivere $B_: $!";
while ($file=readdir DIR) {
#cosi' rimuovi . e ..
        next if $file=~/^\.+$/;
        print FILE "$file \n";
}
close FILE;
close DIR;
-- 
Saluti,
Giancarlo

 il file uno ad uno? 
più didattico? ;))

 il file uno ad uno?
Errata:
Mi rendo conto di aver scritto una frase scorretta e incomprensibile...
Corrige:
"... a che serve mettere tutto in un array per poi scorrere l'array (i 
nomi file) uno ad uno?"
-- 
Saluti,
Giancarlo

Andrea Maestrutti wrote:

Non e' didattico insegnare a fare le cose "male" solo per "vedere" piu' 
funzioni e/o funzionaloita', e' didattico insegnare ad usare le cose 
giuste al momento giusto e nel modo giusto. Fermo restatndo che 
TIMTOWTDT :-)
-- 
Saluti,
Giancarlo

 TIMTOWTDT :-)
ok! ma io l'esempio l'ho preso dal camel book 3! :))

Andrea Maestrutti wrote:

Sara', ma scommetto che in quell'esempio venivano fatte altre cose 
sull'array che non potevano essere fatte "al volo" scorrendo il 
dirhandle, ad esempio un sort o qualche altro "filtraggio" sull'elenco 
dei file.
fare una cosa tipo
@array=<HANDLE>;
foreach (@array) { };
e' IMHO sempre inutile e scorretto (sempre a meno di non fare delle 
operazioni su @array prima del foreach): ha lo stesso effetti di un 
while (<HANDLE>) { } 
ed e' piu' complicato, oneroso per il sistema (penso soprattutta a file 
handle relativi a file di discrete dimensioni che vanno ad occuopare 
memoria inutilmente) e soprattutto (lazyness...) sono 2 righe di codice 
contro una ;-)
-- 
Saluti,
Giancarlo

 contro una ;-)
hai ragione al 100%. Ma anche il camel book, prima presenta i costrutti
nella maniera c-like e poi pompa con il perlished! :)))

 come funge readdir! ;)
Solo come funziona in contasto array, non in contesto scalare. ;-) 
-- 
Saluti,
Giancarlo

 @allfile = grep {$_ne "." && $_ne ".."  } @allfile;
mi sembra che manchi lo spazio tra "$_" e "ne". tutti e due.
in alternativa fai cosi:
for (@allfile) {
    push @newfiles, $_ if $_ ne "." && $_ ne "..";
}
attenta agli spazi:-)
---
Mario Rizzuti

 wrote in message
a508bq$6kvg$2...@stargate1.inet.it...

Non sempre la cosa giusta al momento giusto funziona (es. il tuo script:-))
---
Mario Rizzuti

Grazie!.. il proggy ora funziona!Elimino anche i puntini!
x Mario Rizzuti: riproverň a strutturare il proggy con il tuo
consiglio!sinceramente, nell'esempio che ho riportato, non c'era lo
spazio!
grazie..grazie...grazie!!


 }
Evvai... cosi' invece di trash-are memoria con un array lo facciamo con 
2.....
-- 
Saluti,
Giancarlo

 2.....
-- 


 nell'altro il file B.. e poi effettuare il confronto, vero?
No, a mio avviso non e' necessario, o meglio dipende dal confronto che 
vuoi fare.
Se vuoi confrontare la riga Nesima del primo con la Nesima del secondo 
non serve caricare i file in array, puoi fare qualcosa tipo:
open (UNO, "primo_file");
open(DUE,"secondo_file");
open(OUT,"> file_in_cui_scrivere");
while ($riga_file_1=<UNO>) {
        $riga_file_2=<DUE>;
        print OUT "Quello che vuoi" unless $riga_file_1 eq $riga_file_2;
}
PS: sotto unix esiste un tool che fa gia' questo lavoro si chiama diff 
se ti serve solo fare cio' ti conviene cercari qualche porting delle 
gnu file utils per winzoz.
-- 
Saluti,
Giancarlo

 gnu file utils per winzoz.
E tra l'altro da Perl si possono utilizzare moduli come Text::Diff e 
Algorithm::Diff. Il primo e` equivalente al comando "diff", il secondo un 
po' diverso (migliore?).
Michele.

No, Giancarlo, quello ero riuscita a farlo.. però serve solo x
confrontare righe ennesime in due file distinti! Se la disposizione del
contenuto è differente, mi da un risultato "sballato", xkè mi riporta
anche "righe uguali" contenute in entrambi file (ma in posizioni
differenti).
Mi riferivo invece al confronto di due file, indipendentemente dalla
posizione...


 posizione...
Scusami non capisco.
Pero' ti interessa comunque confrontare una riga di un file a una riga 
del secondo?
cioe':
primo file:
1
2
3
4
5
6
7
8
secondo file
8
9
10
11
12
devi stampare 8
giusto?
se e' cosi' ci sono mille modi di farlo, cosi' su 2 piedi non saprei 
quale e' piu' efficiente...
forse:
while (<UNO>) {
        $check{$_}=1;
}
while (<DUE>) {
        print OUT if $check{$_};
}
usi un solo array associativo e ti eviti i controlli di eguaglianza.
-- 
Saluti,
Giancarlo


prova a fare per ogni elemento di @A uno scan di *tutti* gli elementi di @B:
my @a = <FA>;
my @b = <FB>;
foreach my $line_a (@a) {
   my $ce = 0;
   foreach my $line_b (@b) {
      $ce =  1 if $line_b eq $line_a;
      last if $ce;
   }
   print "diff: $line_a" unless $ce;
}
un hash potrebbe essere piu' veloce ma i file non devono essere troppo
grandi:
my %seen;
while (<FA>) { $seen{$_}++ }
while (<FB>) { $seen{$_}++ }
my @diff = grep { $seen{$_} == 1 } keys %seen;
---
Mario Rizzuti

 grandi:
Cioe'? con un hash ti preoccupi delle dimensini del file, con un array 
no? 
perche'?
-- 
Saluti,
Giancarlo

Ti faccio l'esempio che ho provato:
File A:
a
b
c
d
File B:
a
d
Il proggy dovrebbe stampare su un terzo file (C) b e c!
Il proggy che ho realizzato, mi stampa :b,c,d!
Se modifico il file, in questo modo:
File A:
a
b
c
d
File B:
a
(riga vuota)
(riga vuota)
d
Il proggy mi stampa: "b" e "c"!Cioč, il risultato che a me interessa, ma
se modifico il contenuto, es. in modo casuale..mi da risultati sballati!
(se non č chiaro vi riporto il listato)



Non mi preoccupavo... Il senso e' "se i file sono troppo grandi un hash
potrebbe non essere piu' veloce".
---
Mario Rizzuti

Mario Rizzuti wrote:

mentre un ciclo su un array e' velocissimo.....
-- 
Saluti,
Giancarlo

 .....
quindi ricapitolando, vuoi stampare cio' che e' in A e non in B, giusto?
Prova cosi':
while (<B>) {
        $check{$_}=1;
}
while (<A>) {
        print OUT unless $check{$_};
}
-- 
Saluti,
Giancarlo

 wrote in message
a53ipm$68cc$1...@stargate1.inet.it...

scusa ma se ci vuole...
tu come faresti senza usare ne array ne hash?
---
Mario Rizzuti

 tu come faresti senza usare ne array ne hash?
Ne uso il meno possibile... non due sicuramente.
-- 
Saluti,
Giancarlo


non vedo come
---
Mario Rizzuti

 non vedo come
L'ho scritto in un altro post
-- 
Saluti,
Giancarlo