OK, dopo diversi test ho accertato che l'array non č vuoto al momento in cui deve essere riversato nel file; infatti in un'occasione sono riuscito a fargli scrivere il file; ora mi spiego:
siamo in un ciclo (riportato di seguito) durante il quale viene chiamata la subroutine incriminata "log" (riportata di seguito);
SITUAZIONE 1:
se lascio completare tutti i cicli normalmente dal primo all'ultimo (come dovrebbe essere), ad ogni ciclo l'array viene scritto a video MENTRE il corrispondente file viene riscritto vuoto (cancellando tutto quello che avevo scritto a mano per prova);
SITUAZIONE 2:
se INVECE inserisco un " exit; " subito dopo la scrittura e chiusura del file facendo quindi eseguire la subroutine una sola volta, allora l'array viene scritto sia a video che nel file. (questa č l'unica situazione nella quale ottengo quel risultato.)
Se hai delle idee ti prego di dirmele,
grazie 1000
il codice:
codice:
{
my $count = 0;
open(YEST, "<db/stats/yesterday.data") or die &error('Cannot open \'yesterday.data\' Line 112');
open(YESTBEF, "<db/stats/yesterday_before.data") or die &error('Cannot open \'yesterday_before.data\' Line 114');
CYCB: while(<YEST>) {
$count++;
if($count == 500) { $count = 0; sleep 2; }
/(http:\/\/.+)\|(\d+)\n/;
my $url = $1;
my $logs = $2;
while(<YESTBEF>) {
### Confronti
if(/$url\|(\d+)\n/) {
my $hits = $logs - $1;
if($hits == 0) { next CYCB; }
&log($url,$hits);
next CYCB;
}
}
&log($url,$logs);
}
close(YEST) or die &error('Cannot close \'yesterday.data\' Line 141');
close(YESTBEF) or die &error('Cannot close \'yesterday_before.data\' Line 142');
}
### SUB LOG
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>) {
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 JANUARY
}elsif(($new_month == 1)&&($month != 1)) {
while(<LOG>) {
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 (JANUARY)
}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(LOG, ">../db/stats/all/$filename.data") || die("Cannot open '$filename.data' Line 212\n");
print LOG @new_logs;
print "Siamo al punto X @new_logs\n"; #### CONTROLLO #### l'ARRAY VIENE SCRITTO A VIDEO PER OGNI CICLO
close(LOG) || die("Cannot Close File Line 216\n");
exit; ### IL CICLO SI FERMA E L'ARRAY č STATO SCRITTO ANCHE NEL FILE, IN MANCANZA DI QUESTO EXIT, AD OGNI CICLO L'ARRAY VIENE SCRITTO A VIDEO MA NON NEL FILE.
}