DB einlesen
open(ARCHIVDB,"<$pfaddb");
@ALLARCHIVDB = <ARCHIVDB>;
close(ARCHIVDB);neuer DB-Eintrag am Anfabg des Array anfügen
unshift(@ALLARCHIVDB,"$date|$time|$msg|\n");
DB wieder in Text-Datei schreiben
$mycount = 1;
open (DAT,">$pfaddb") ;
foreach $getline(@ALLARCHIVDB)
{
if($mycount < 11)
{
$mycount = $mycount + 1;
print DAT $getline;
}
}
close (DAT) ;
Falls dies ein CGI Skript ist, werden dir früher oder später Einträge verloren gehen. zwischen dem 1.close und den 2.open kann durchaus ein neuer Prozeß auf die Datei zugreifen und diese einlesen in dem Moment wird der Eintrag vom ersten Prozeß sofort wieder verschwinden.
Du musst die Datei zum lesen und schreiben öffnen und flocken. In etwa so
#!/usr/bin/perl -w
use strict;
use Fcntl qw(SEEK_SET LOCK_EX);
my $flock = 1;
my $pfaddb = 'test.txt';
my $daten = 'test';
my $max = 10;
open FH, ">$pfaddb" or die "Kann $pfaddb nicht öffnen, weil:$!";
for(0..20)
{
print FH "$_.$daten\n";
}
close FH;
open FH, "+<$pfaddb" or die "Kann $pfaddb nicht öffnen, weil:$!";
flock(FH, LOCK_EX) if $flock;
seek FH, 0,SEEK_SET;
my $count = 0;
while(<FH>)
{
$count++;
last if $count == $max;
}
my $pos = tell FH;
truncate FH, $pos or die $!;
seek FH, $pos, SEEK_SET;
print FH "neu-$daten\n";
close FH;
Struppi.