Newsgroup: it.comp.lang.perl
Titolo: cancellare files

 Salve a tutti!
Un piccolo quesito..  ho questo frammento di codice del mio bot irc:
if ($answer =~ /\:($admin).+?(PRIVMSG)(.+?)\s\:\!msgdel\s(.*)$/) {
                          print $server "PRIVMSG $admin :Cancellato log 
$4\r\n";
                          unlink "logs/$4";
Se eseguo il comando "!msgdel pippo.txt", ricevo regolarmente la risposta 
del bot "Cancellato log pipo.txt" .... ma non si cancella niente..... il 
file da cancellare � regolarmente al suo posto, e non ottengo nessun 
messaggio di errore, dove sbaglio?
-- 
Ciao!
Se hai voglia e tempo visita il mio sitarello!
www.moredifficult.org
www.liftman.org
http://florezia.myminicity.com
 

 messaggio di errore, dove sbaglio?
Permission del file?
Ciao,
luigi
-- 
/
+--[Luigi Rosa]--
\
Statisticians do it with 95% confidence.

 Permission del file?
lettura e scrittura per il proprietario (cioe' io...), per scrupolo ho 
provato ad estendere i permessi a tutti ma il risultato non cambia. In ogni 
caso se fosse un problema di permessi credo che otterrei un "permission 
denied" o roba simile.
Ho fatto altre prove direttamente "a manina" (al di fuori dal mio script), e 
questo e' quello che succede:
~/scripts/BOT$ perl -e 'unlink logs/SwEeTlOvE.txt;'  # ottengo il seguente 
messaggio:
           Illegal division by zero at -e line 1.
~/scripts/BOT/logs$ perl -e 'unlink SwEeTlOvE.txt;' # non succede niente ma 
il file resta li'
a questo punto non saprei che pesci prendere...
ciao!

 a questo punto non saprei che pesci prendere...
Prova ad indicare il percorso completo del file

 a questo punto non saprei che pesci prendere...
Devi semplicemente controllare il valore restituito da unlink e in caso di
errore stampare $!. Ad esempio:
      unlink "logs/$4" or die $! ;
Se ti dice "no such file or directory", significa che il percorso non �
corretto. Se ti sembra corretto, probabilmente la directory corrente in
quel punto non � quella che tu credi che sia.
Max

 corrente in quel punto non � quella che tu credi che sia.
ho provato a dare in pasto allo script qualsiasi combinazione, ma con il 
medesimo risultato. Oltretutto usando lo stesso percorso (logs/$4) i vari 
files vengono letti regolarmente, e se il percors' e' giusto in lettura, 
dovrebbe esserlo pure per il resto.
Il mio script risiede in home/liftman/scripts/BOT e i files di log in 
home/liftman/scripts/BOT/logs, quindi darei per scontato che la directory 
corrente sia perlappunto "BOT" e di conseguenza "logs/nomefile" il percorso 
corretto per cancellare i files.
grazie cmq, ciao! 

 "logs/nomefile" il percorso corretto per cancellare i files.
nell'attesa che qualcuno trovi una soluzione al mio (strano) problema, ho 
continuato a far prove. Il guaio e' che sono ancora piu' confuso....
partiamo con ordine:
supponendo che ci potessero essere "incomprensioni" ho modificato
unlink "logs/$4" or die $!;
con
my $dellog = "logs/" . $4;
unlink $dellog or die $!;
ma non cambia niente....  quindi ho provato un mini-scrpt monocomandoi':
#!/usr/bin/perl
unlink "nomefile.txt" or die $!;
eseguito direttamente nella cartella che contiene i files ed ha funzionato, 
riprovato con:
#!/usr/bin/perl
unlink "logs/nomefile.txt" or die $!;
eseguito dalla cartella dove risiede lo script incrimiinato, e pure cosi' 
funziona perfettamente.
Conclusione: il percorso indicato sullo script e' esatto, tanto piu' che 
nello script con lo stesso percorso, si legge il contenuto della cartella 
e/o si mostra il contenuto dei files stessi senza il minimo problema. I 
permessi sui files sono giusti perche' eseguendo il miniscript dallo stesso 
account 8e dalla stessa macchina) con il quale eseguo lo script, riesco a 
cancellare regolarmente....
Idee?


 
Sostituisci con:
 if ( ! unlink($dellog) )
 {
        use Cwd;
        warn( getcwd, "/", $dellog, ": ", $!, "\n");
        die;
 } 
Max

 typed:

mi ritorna questo messaggio:
No such file or directoryogs/SwEeTlOvE.txt
Died at 
bot.pl
 line 314, <GEN0> line 70.

 No such file or directoryogs/SwEeTlOvE.txt
Ah! C'� uno "\r" alla fine di $dellog. Modifica la regexp che usi per
estrare la stringa. Al posto di '(.*)' puoi usare '([^\r]*)'.
Per inciso, ti consiglierei anche di controllare mooolto bene il contenuto
di $4 prima di usarlo come componente di un percorso (hint: "../").
Max

 "../").
....scusami, ma non ho capito a cosa ti riferisci (l'ora tarda.? meglio che 
ci dormo sopra...)
Ciao! e grazie
-- 

 estrare la stringa. Al posto di '(.*)' puoi usare '([^\r]*)'.
allora.... con questa modifica, non viene riconosciuto il comando (!msgdel 
momefile), quindi ho rimesso tutto com'era. Pero' continuo a non capire una 
cosa... fondamentalmente tutta la "gestione" di questi benedetti logs 
funziona, lista i files, li mostra a comando, con il solo non funzionamento 
della parte che dovrebbe cancellarli. Siccome la stessa regex si occupa di 
"estrapolare" il comando ed e' assodato che bene o male funziona, (anche se 
probabilmente essendo un neofita avrei potuto far meglio), mi piacerebbe 
capire perche' un percorso e un nomefile valido per mostrare il contenuto di 
un file, non lo sia per la sua cancellazione. Onestamente quando ho iniziato 
ad interessarmi al perl, questo e' l'ultimo scoglio che avrei pensato di 
trovare...
Questo e' il codice per mostrare il contenuto del log:
if ($answer =~ /\:($admin).+?(PRIVMSG)(.+?)\s\:\!msgread\s(.*)$/) {
                         open (LOGS, "logs/$4") || die "Non posso aprire 
logs/$4";
                          while ($log = <LOGS>) {
                              print $server "PRIVMSG $admin :$log\n";
                             }
                        close (LOGS);
                        print $server "PRIVMSG $admin :Per cancellare il 
log, !msgdel $4\r\n";
                 }
e questa la parte per cancellare com'era scritta inizialmente:
if ($answer =~ /\:($admin).+?(PRIVMSG)(.+?)\s\:\!msgdel\s(.*)$/) {
                          unlink "logs/$4";
                          print $server "PRIVMSG $admin :Cancellato log 
$4\r\n";
                 }
Buon Sabato!

 momefile), quindi ho rimesso tutto com'era. 
Abbiamo appurato che c'� un '\r' alla fine di $4. Quindi devi modificare la
regexp affinch� non venga catturato il '\r' finale. Mi pare che qui non ci
sia nulla di misterioso.
Il "problema", semmai, non � perch� non funzioni unlink, quanto perch�
funzioni open, dato che il percorso costruito � chiaramente sbagliato. La
spiegazione � che open, quando invocato in quel modo, rimuove ogni
whitespace (quindi anche '\r') all'inizio e alla fine della stringa. �
sempre meglio usare la versione di open a 3 argomenti. Se sostituisci la
tua riga con 
  open (LOGS, "<", "logs/$4") || die "Non posso aprire logs/$4";
otterrai l'errore aspettato.
Max

 otterrai l'errore aspettato.
Che bello! sono riuscito a commettere un errore funzionante :D A parte gli 
scherzi, sistemo anche questa piccola dimenticanza e per un po' (spero) di 
non rompere piu', pian piano imparero'.
Ti ringrazio per la pazienza e ti auguro una buona domenica, ciao!