MrSpoocy: Array in anonymen Hash über die Referenz löschen ?

Beitrag lesen

Hi,

erst mal mega Danke für deine Hilfe, scheinst dir ja wirklich Gedanken über meinen Post gemacht zu haben. Freut mich :)

Ja also die Struktur ist bisschen falsch, viel mir jetzt auch auf. Hier jetzt die richtige Struktur und auch ein "schlechtes" script welches geht.

my $spam_seconds = 10;  
my $public_chat = {'MrSpoocy' => {  
		'Ich Spame !' => [time,time-3,time-15,time-7,time-2],  
		'Oder auch so' => [time, time-1,time-4]  
	},  
	'Robert' => {  
		'Text ABC' => [time, time-16],  
		'Other Text' => [time,time-2,time-15]  
	}  
};  
  
sub onFlood {  
	print Dumper(\$public_chat);  
  
	# Als erstes lösche alte Einträge  
	foreach my $key (keys %$public_chat)  
	{  
		foreach my $message (keys %{$public_chat->{$key}})  
		{  
			for (my $i=0; $i< @{$public_chat->{$key}->{$message}}; $i++)  
			{  
				my $ctime = $public_chat->{$key}->{$message}->[$i];  
				if ($ctime < (time - $spam_seconds))  
				{  
					splice (@{$public_chat->{$key}->{$message}}, $i, 1);  
				}  
  
			}  
		}  
	}  
  
	print Dumper(\$public_chat);	  
return 1;  
}  
onFlood();

Was soll das ganze ?
Nun ja, es soll wie man glaub ich auch erkennen kann ein antiSpam/Flood Filter werden. Diese jedoch (kann) berücksichtigen das jeder Text an sich gezählt wird. Sodas ein User in 10sek mehr als 3 Verschiedene Texte schreiben kann jedoch nicht 3 mal das gleiche in 10sek. Dieser Teil des Script's löscht erst mal nur alte Einträge welche eh schon älter als 10sek sind und somit ignoriert werden können. Löschen tu ich sie damit der Hash nicht unendlich groß wird.

Ein Fehler ist mir sowohl bei mir als auch bei dir aufgefallen, wenn man mit # delete ein Element aus einem Array löscht, dann wird dieser nur zu # undef und die anderen Elemente rücken nicht auf, und das hat später im gesamt Script negative Auswirkungen (z.b. # length()). Aus diesem Grund nehme ich nun # splice.

Was mich aber wundert (muss ich eine Wissenslücke habe) warum @{$public->{} nicht das gleiche ist wie @$public->{}, magst du mir das vielleicht erklären ohne auf die perldoc zu verweisen ;) ?

mfg Spoocy