Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15

Discussione: Non Scrive su File

  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2000
    Messaggi
    46

    Non Scrive su File

    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.

    codice:
    	
    
    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!!!
    zamak

  2. #2
    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.
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2000
    Messaggi
    46
    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: ):
    codice:
    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):
    codice:
    open(DATA, ">../db/stats/all/l.data") || die "cannot open";
    print DATA 'dddddddddddddddddddddddddddddddddddddddddddddddddddddddddd';
    close(DATA) || die "cannot close";
    exit;
    grazie, ciao,
    zamak

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2000
    Messaggi
    46

    aggiungo...

    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!!!
    zamak

  5. #5

    Re: aggiungo...

    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!!!
    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.
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2000
    Messaggi
    46
    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?
    zamak

  7. #7
    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.
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2000
    Messaggi
    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?
    zamak

  9. #9
    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.
    Marco Allegretti
    shishii@tiscalinet.it
    Lang: PERL, PHP, SQL.
    Linux user n° 268623 Fedora Core 10, Fedora Core 6, Debian Sarge on mips

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2000
    Messaggi
    46
    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.
    zamak

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.