Alain: kein DBM close nach untie ?

Beitrag lesen

hi,

Nein, du hast immer noch nicht verstanden.

Angenommen der Eintrag $hash{'name'} existiert nicht.

»»

ja diese abfrage sollte am anfang sein aber nicht mit if (exists
sondern ich will wissen ob der eintrag nicht existiert.Wär dann if (!exists $hash{$name}) korrekt?

Dann ruft
if( $hash{'name'} eq 'test')
eine warnung hervor, weil du versuchst auf einen undefinierten wert zu zugreifen,

das ist mir klar.

Wie ich dir schon schribe if( exists $hash{'name'}) prüft ob der schlüssel (also der eintrag) existiert.

Desshalb nehm ich das raus,weil am schluss der eintrag
$dbfile{$username} = ("$agent_now*$count_last*$date_today");

FALSCH!!!!!
%dbfile existiert nicht. In deinem Beipsiel heißt es %hash

doch neuerdings nehm ich das "my %dbfile;" als hash - sorry.

Außerdem hast du geprüft ob:
$username
$agent_now
$count_last
$date_today

ja diese variablen sind gesetzt.

Du kannst die Warnungen auch vermeiden, wenn du bei der Deklaration einen Defaultwert (z.b. einen Leerstring) zuweist.

z.b.

$username = $ENV{HTTP_USER} || '';

hab ich auch so und am anfang wird es auch geprüft so
if($username eq ''||!$username)
{
exit;
}

jezt kannst du ohne Problem mit $username vergleiche oder verkettungen durchführen und erhälst keine Warnung.

wenn du auf eine variabel zugreifen möchtest, soltest du diese vorbelegen oder mit if(defined $var) überprüfen ob sie definiert wurde und schon meckert Perl nicht mehr.

das wollte ich ja mit if (!-e $username ... oder if (!/$username/) aber es geht so nicht weil sich etwas widerspricht.

Das eine hat mit dem anderen nichts zu tun und schon gar nicht mit dem was ich dir versuche zu erklären.
-e $var heißt 'existiert die Datei $var ' und das andere: kommt $username nicht in der Spezialvariabel $_ vor.

aha die datei also und nicht den wert bzw. hash in einer datei?!

Ich glaub das ist nicht was du willst.

Wenn du Wissen willst ob eine Varibel einen definierten Wert hat:
if(defined $var) { print "definiert";}

das ist nicht nötig.Ich möchte eigentlich nur wissen ob der eintrag
$dbfile{$username} = ("$agent_now*$count_last*$date_today");
in der dbfile NICHT existiert ohne else zweig oder so.

Wenn du Wissen willst ob ein Schlüssel eines Hashes existiert:

if(exists $hash{'key'} { print "Der Schlüssel 'key' existiert";}

also in meinem fall etwa so?
if(!exists $dbfile{$username})
{
$dbfile{$username} = ("$agent_now*$count_last*$date_today");
}

also wie gehabt beim ersten aufruf des scriptes bzw. einem neuen user,wird der eintrag erst am schluss gemacht in die dbfile,
was aber dann zur warnung führt weil der hash ja nicht in der dbfile ist.