Ich habe eine textdatei welche einträge von waren|preis|anzahl beinhaltet bsp. der textdatei:
Du hast eine Datenbank.
datum|ipadresse|
ware1|20.00|1|
ware2|25.00|1|
Wenn dir mySQL oder ähnliches zu kompliziert ist (früher oder später sollte man sich damit trotzdem auseinadersetzen - ich hab aber zugegeben auch einige Jahre mcih davor gedrückt), dann sei dir das Modul DB_File an Herz gelegt, damit kannst du solche Sachen wesentlich einfacher bewerkstelligen.
...
im perlsscript steht:
sub delete_item {
open (REFFILE,"$reffile")||error('cannot open cart ');
Ich weißß nicht ob dir das schon erzählt wurde. In $! steht warum das öffent scheitert, das kann u.U. nützlich sein.
my @newlines = ();
my @lines=<REFFILE>;
close(REFFILE);
Hier schon mal, deine Vorgehensweise kann u.U. zu Datenverlust führen, wenn hier in dem Augenblick eine anderes Programm auf die Datei zugreift, kann es passieren das die Daten, die du unten eintragen willst verschwinden. Und kann heißt in solch einem Falle fast immer, es wird passieren.
(ausser das Skript ist lokal und du bist der einzige der es nutzt)
Es gibt Möglichkeiten dies zu verhindern, Stichwort 'flock'
my $items = $FORM{'Video(s)'};#wird vom formular geschickt
Du arbeitest immer noch nicht mit CGI.pm?
Du bist sicher das in dem Eintrag ein Wert steht?
my($itemname, $itemprice, $itemquant) = split(/|/,$_);
Was ist den $_ hier an dieser stelle?
foreach (@lines)
Weiter oben bist du bereits alle Einträge durch gegangen (while <REFILE>) und jetzt nochmal?
Das ist evtl. eine grosse Verschwendung je nachdem wie gross diese Datei ist.
Es gibt die Möglichkeit Dateien zum lesen und schreiben zu öffnen.
{
push (@newlines,$_) if ($_ !~ /^$items|/i);
my $newfile = join("|",@newlines);
Was hier passiert ist völlig wirr.
Wenn in der aktuellen Zeile $items vorkommt, dann push es auf das array. Dann wird das Array mit den Zeichen '|' zusammengefügt und einer lokal gültigen Variabel zugewiesen.
}
$newline existiert hier nicht mehr.
open (REFFILE,">$reffile")||error('cannot open file for write');
print REFFILE "$newfile\n";
und daraus läßt sich vermuten, dass du auch nicht mit use strict arbeitest, dann wäre das gar nicht möglich, denn $newline ist undefiniert.
close(REFFILE);
}
entweder löscht das script alles oder aber es steht anschliessend nur das datum und ip eintrag drinnen.
Was kann da noch fehlen?
Hmm? Eine Logik?
Wie gesagt DB_File ist für solch einen Fall wesentlich günstger.
Ich hab mal gekramt, so würde das z.b. aussehen:
#!/usr/bin/perl -w
use strict;
use DB_File;
use Fcntl qw(O_RDWR O_CREAT);
my $file = 'test.db';
my %daten;
my $DBH = tie %daten, 'DB_File', $file, O_RDWR|O_CREAT, 0777;
save('test', 1.99, 50);
save('test1', 1.99, 50);
save('test2', 1.99, 50);
print "Daten:\n\n";
foreach(keys %daten)
{
my $d = get($_);
print "Produket:$d->{name} = $d->{itemprice} $d->{itemquant} \n";
}
print "lösche test1....\n";
del('test1');
print "Daten:\n\n";
foreach(keys %daten)
{
my $d = get($_);
print "Produket:$d->{name} = $d->{itemprice} $d->{itemquant} \n";
}
sub save
{
my($itemname, $itemprice, $itemquant) = @_;
$daten{$itemname} = "$itemprice|$itemquant";
}
sub get
{
my $name = shift || return;
return unless exists $daten{$name};
my @tmp = split '|', $daten{$name};
my $item = {
name => $name,
itemprice => $tmp[0],
itemquant => $tmp[1]
};
return $item;
}
sub del
{
my $name = shift || return;
delete $daten{$name};
}
Struppi.