PDA

Visualizza la versione completa : Non Scrive su File


zamak
10-12-2004, 23:45
Ciao a tutti,

Non ho veramente idea di quale sia la causa del mio problema:

il seguente codice dovrebbe naturalmente scrivere nel file $filename.data i dati della lista @new_logs;

come test per vedere se lo script viene correttamente eseguito fino a quel punto, ho inserito il print sullo standard output che dimostra che l'output c', ma purtroppo il file non viene scritto, inoltre se fosse un problema di apertura o chiusura del file avrei un messaggio d'errore e l'interruzione dell'esecuzione (con die), invece mi ritrovo al prompt unix come se fosse tutto regolare.




close(LOG) or die("Cannot Close File Line 210\n"); # chiusura del file per operazioni precedenti con Handler diverso
open(NWLOG, ">../db/stats/all/$filename.data") or die("Cannot open \'$filename.data\' Line 212\n");
print NWLOG @new_logs;
close(NWLOG) or die("Cannot Close File Line 216\n");
print "@new_logs - sono qui\n";



strano o no? (mi piacerebbe sentire che non lo )

aspettando risposte, grazie in anticipo,
ciao!!!

shishii
11-12-2004, 10:49
Ciao,

che vuol dire non scrive?

se nel tuo file ci sono gi dei dati, questi vengono cancellati?

con che opzioni montata la partizione su cui scrivi?

prova anche a sostituire gli 'or' che usi con '||' che ha una precedenza maggiore.

zamak
11-12-2004, 12:19
Ciao Shishii, grazie per la risposta,

non scrive il file nel senso che l'array '@new_logs' contiene dei dati che dovrebbero essere semplicemente scritti nel file che aperto in scrittura, mentre il file rimane vuoto.

Prima di questa operazione, il file viene letto ed alcuni dati (se ci sono) vengono utilizzati per modifiche all'array, quindi il file viene chiuso, poi il file viene riaperto in scrittura per riportarci dentro (da nuovo '>') l'array, ma il file rimane completamente vuoto anche se sull'STDOUT verifico l'esistenza del contenuto dell'array.

Neanche con || al posto di or ho risultati di errore.

non so esattamente cosa intendi quando dici <<con che opzioni montata la partizione su cui scrivi?>> forse ti riferisci alla configurazione del disco??? Ho gi svolto dei test per scrivere sugli stessi files con uno script dalla stessa directory dello script principale ed tutto ok (riporto lo script per il test in fondo al post).


Invece qui, posto l'intera funzione inquestione, premetto che i files da leggere e poi scrivere sono originariamente vuoti (sempre vuoti durante tutte le prove) ( vedi anche commenti delle linee # TEST: ):



sub log {

my $new_ref = 1;
my $new_log;
my @new_logs;
$_[0] =~ m/http:\/\/(?:www\.)?(.)/;
my $filename = $1;
open(LOG, "<../db/stats/all/$filename.data") or die &error("Cannot open \'$filename.data\' Line 112");

### - 1 - ### NO NEW MONTH
if($new_month != 1) {

while(<LOG>) {
$security++; if($security > 100000) { &error('WHILE LOOP 157'); } ### SECURITY ###
if(/$_[0]\|.+?\|(\d+)\|(\d+)\|(\d+)\|(\d+)\|(\d+)\|(\d+)/) {
$new_log = "$_[0]".'|'."$yesterday".'|'."$_[1]".'|'."$1+$_[1]".'|'."$3".'|'."$4+$_[1]".'|'."$5+$_[1]"."\n";
push(@new_logs,$new_log);
$new_ref = 0;
}else{
push(@new_logs,$_);
}
}

if($new_ref == 1) {
$new_log = "$_[0]".'|'."$yesterday".'|'."$_[1]".'|'."$_[1]".'|'."0".'|'."$_[1]".'|'."$_[1]"."\n";
push(@new_logs,$new_log);
}

### - 2 - ### NEW MONTH BUT NOT GENUARY
}elsif(($new_month == 1)&&($month != 1)) {

while(<LOG>) {
$security++; if($security > 100000) { &error('WHILE LOOP 178'); } ### SECURITY ###
if(/$_[0]\|.+?\|(\d+)\|(\d+)\|(\d+)\|(\d+)\|(\d+)\|(\d+)/) {
$new_log = "$_[0]".'|'."$yesterday".'|'."$_[1]".'|'."$_[1]".'|'."$2".'|'."$4+$_[1]".'|'."$5+$_[1]"."\n";
push(@new_logs,$new_log);
$new_ref = 0;
}else{
/(.+?\|.+?\|)(\d+)\|(\d+)\|(\d+)\|(\d+)\|(\d+)\|(\d +)/;
$new_log = "$1"."$2".'|'."$2".'|'."$3".'|'."$5".'|'."$6"."\n";
push(@new_logs,$new_log);
}
}

if($new_ref == 1) {
$new_log = "$_[0]".'|'."$yesterday".'|'."$_[1]".'|'."$_[1]".'|'."0".'|'."$_[1]".'|'."$_[1]"."\n";
push(@new_logs,$new_log);
}

### - 3 - ### NEW MONTH and NEW YEAR (GENUARY)
}else{

while(<LOG>) {
$security++; if($security > 100000) { &error('WHILE LOOP 201'); } ### SECURITY ###
if(/$_[0]\|.+?\|(\d+)\|(\d+)\|(\d+)\|(\d+)\|(\d+)\|(\d+)/) {
$new_log = "$_[0]".'|'."$yesterday".'|'."$_[1]".'|'."$_[1]".'|'."$2".'|'."$_[1]".'|'."$5+$_[1]"."\n";
push(@new_logs,$new_log);
$new_ref = 0;
}else{
/(.+?\|.+?\|)(\d+)\|(\d+)\|(\d+)\|(\d+)\|(\d+)\|(\d +)/;
$new_log = "$1"."$2".'|'."$2".'|'."$3".'|'."$2".'|'."$6"."\n";
push(@new_logs,$new_log);
}
}

if($new_ref == 1) {
$new_log = "$_[0]".'|'."$yesterday".'|'."$_[1]".'|'."$_[1]".'|'."0".'|'."$_[1]".'|'."$_[1]"."\n";
push(@new_logs,$new_log);
}

}

close(LOG) || die &error('Cannot Close File Line 210');

open(NWLOG, ">../db/stats/all/$filename.data") || die("Cannot open \'$filename.data\' Line 212\n");
print NWLOG @new_logs || print "errore in scrittura\n";
close(NWLOG) || die("Cannot Close File Line 216\n");

print "../db/stats/all/$filename.data\n"; # TEST: verifico che il path/nome del file sia corretto.
print "@new_logs - Sono Qui\n"; # TEST: verifico che l'array non vuoto (array destinato a l.data non vuoto (vedi test sotto)).
}




script per test in scrittura su l.data ( uno dei files destinatari dell'array @new_logs che contiene sicuramente dati):



open(DATA, ">../db/stats/all/l.data") || die "cannot open";
print DATA 'ddddddddddddddddddddddddddddddddddddddddddddddddd ddddddddd';
close(DATA) || die "cannot close";
exit;



grazie, ciao,

zamak
11-12-2004, 13:37
aggiungo che...

se rimpiazzo:
open(NWLOG, ">../db/stats/all/$filename.data") || die("Cannot open \'$filename.data\' Line 212\n");

con:
open(NWLOG, ">prova.data") || die("Cannot open \'$filename.data\' Line 212\n");

il file 'prova.data' viene scritto!!! :dh:

shishii
11-12-2004, 15:14
Originariamente inviato da zamak
aggiungo che...

se rimpiazzo:
open(NWLOG, ">../db/stats/all/$filename.data") || die("Cannot open \'$filename.data\' Line 212\n");

con:
open(NWLOG, ">prova.data") || die("Cannot open \'$filename.data\' Line 212\n");

il file 'prova.data' viene scritto!!! :dh:

Questo non significa nulla, in quanto si tratta di directory diverse.

La prova che devi fare scrivere a mano qualcosa in $filename.data, poi esegui lo script e verificare se quello che avevi scritto stato cancellato oppure no, serve per vedere se il file viene aperto in scrittura o meno.

Per quanto riguarda la partizione dove sta la directory potrebbe essere importante sapere se stata montata con opzioni che modificano il sincronismo tra metadati e dati.

Infine ci sarebbe da accertare se il web server stato configurato per scrivere o meno in certe directory.

zamak
11-12-2004, 17:47
Come detto nel mio precedente post, ho gi fatto la prova per scrivere sullo stesso file '$filename.data' creando uno script appositamente per quello, e funziona (vedi mio post).
Le prove che possono sembrare insensate le ho fatte proprio perch il problema stesso mi appare insensato e cerco cause che ignoro...

che altro posso fare?

shishii
11-12-2004, 17:53
ripeto... fai la prova di scrivere A MANO qualcosa nel file incriminato e POI aziona lo script. Poi vai a vedere se quallo che avevi scritto a mano stato cancellato o meno.

zamak
11-12-2004, 22:46
grazie ancora, scusami ma non ti avevo capito;

ora ho provato a scrivere a mano il file e mandarlo sul server, dopo aver lanciato lo script EFFETTIVAMENTE mi sono ritrovato con il file VUOTO cancellato; ci vedi una spiegazione?

shishii
12-12-2004, 19:34
Questo significa che il file stato aperto in scrittura, ma che NON vi stato riversato il contenuto dell'array, per cui prova a modificare questo codice:

open(NWLOG, ">../db/stats/all/$filename.data") || die("Cannot open '$filename.data' Line 212\n");
print NWLOG @new_logs || print "errore in scrittura\n";
close(NWLOG) || die("Cannot Close File Line 216\n");

cos:

open(NWLOG, ">../db/stats/all/$filename.data") || die("Cannot open '$filename.data' Line 212\n");
if (@new_logs) {
print NWLOG @new_logs || print "errore in scrittura\n";
} else {
print NWLOG "L'array vuoto\n";
}
close(NWLOG) || die("Cannot Close File Line 216\n");

esegui lo script e poi vai a leggere a mano il file dove lo script avrebbe dovuto scrivere.

zamak
12-12-2004, 23:00
Grazie ancora shishii,

ho usato il codice come hai detto tu, dovrei trovarmi il file scritto o il testo 'L'array vuoto', l'ho provato, risultato:
il file scritto a mano vuoto (cursore all'inizio, no spazi, vuoto, 0 bytes) e nient'altro;

allora ho inserito il print come puoi vedere sotto, e il print funziona ripetendo la scritta 'ciao' per ogni ciclo (siamo in un ciclo while dove per ogni ciclo viene aperto e scritto un file);

il risultato dell'if sembra dimostrare che l'array non vuoto (gi dimostrato in precedenza con prove sull'STDOUT) ma che quando viene scritto sul file per qualche motivo viene considerato vuoto.

sembra essere qualcosa che avviene durante l'operazione di scrittura del file, e non ho idea di cosa possa essere.

Loading