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.

}