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,