Use of uninitialized value...in concatenation (.) or string...
Alain
- perl
Hallo Malzeit,
Ich hab da ein problem was ich nicht versteh:
Der error log sagt:
Use of uninitialized value in concatenation (.) or string at logintest.pl line 81, <DATEN> line 1.
Use of uninitialized value in concatenation (.) or string at logintest.pl line 81, <DATEN> line 2.
Use of uninitialized value in concatenation (.) or string at logintest.pl line 81, <DATEN> line 3.
Use of uninitialized value in concatenation (.) or string at logintest.pl line 81, <DATEN> line 4.
aber das ist doch immer die selbe linie ,warum 1,2,3,4
Das problem zeigt auf
if (/^$username:$crypted/)
in der sub die so
sub check {
open(DATEN, "<$htpasswd")||die("401 error 5\n");
flock(DATEN, LOCK_SH)||die("401 error 4\n");
while (<DATEN>){
if (/^$username:$crypted/)
{
close (DATEN);
return 1;
}
}
return 0;
}
aussieht.
Abfragen tu ich elsif (check()) {mach was} else {bad()....
keine ahnung was jetzt wieder falsch ist.
Ich habs mal mit if (/^$username:$crypted/) versucht,dann gibts zwar kein fehler im error log,aber dann funktioniert das script auch nicht mehr ?Kann man das auch anders als mit while lösen?
Grüsse
Alain
Tag Alain.
Ich hab da ein problem was ich nicht versteh:
Das problem zeigt auf
if (/^$username:$crypted/)
Wie sind $username und $crypted initialisiert? Die Warnung kommt zwar bei o.g. Zeile, aber nur deshalb, weil es Perl bis dahin nicht interessiert hat, ob die Variablen initialisiert sind oder nicht. Übrigens ist es ein kleiner aber bedeutender Unterschied, ob du schreibst:
my $var;
oder
my $var = "";
Beide Variablen sind zwar definiert, erstere aber nicht initialisiert.
[dsf 3.6]
Siechfred
Hallo,
Ich hab da ein problem was ich nicht versteh:
Das problem zeigt auf
if (/^$username:$crypted/)Wie sind $username und $crypted initialisiert? Die Warnung kommt zwar bei o.g. Zeile, aber nur deshalb, weil es Perl bis dahin nicht interessiert hat, ob die Variablen initialisiert sind oder nicht. Übrigens ist es ein kleiner aber bedeutender Unterschied, ob du schreibst:
my $var;
oder
my $var = "";Beide Variablen sind zwar definiert, erstere aber nicht initialisiert.
ja ich glaub auch dass es mit der variable my $crypted was zu tun hat
diese variable steht unterer dem if (check())...was möglicherweise zum fehler geführt hat.Das crypten sollte erst ausgeführt werden,wenn sicher ist,dass das password existiert.my $crypted sieht so aus:
my $crypted = crypt($password, "Md") if ($password !~ /^Md/);
Das "if ($password !~ /^Md/)" mach ich desshalb,weil ich verschlüsseltes gookie dazu generieren möchte.
Ich das split jetzt if (/^$username:$crypted/) so...
und plötzlich geht alles 8-)
ich vermute die variable my crypted war zu weit unten...
dumm wäre wenn jemand ein klartext password,welches mit Md anfängt benutzen würde :)
Gruss
Alain
wie immer konfus ;-)
ja ich glaub auch dass es mit der variable my $crypted was zu tun hat
diese variable steht unterer dem if (check())...was möglicherweise zum fehler geführt hat.Das crypten sollte erst ausgeführt werden,wenn sicher ist,dass das password existiert.my $crypted sieht so aus:
my $crypted = crypt($password, "Md") if ($password !~ /^Md/);
Das ist schlecht, was ist, wenn die Bedignung nicht zutrifft?
Dann wird $crypted nie initialisiert.
Ich vermute mla du willst eher sowas machen:
my $crypted = $password =~ /^Md/ ?
crypt($password, "Md") :
$password;
Du verwendest globale Variabeln?
Das solltest du vermeiden, früher oder später kannst du verlierst du die Übersicht.
Es gibt in Perl durchaus die Möglichkeit Funktionen einen Parameter mit zugeben (in deinem Falle check($username, $password) z.b.)
Struppi.
Hallo Struppi,
wie immer konfus ;-)
war ja nicht anders zu erwarten ;-) (kennst mich ja schon ein b...)
ja ich glaub auch dass es mit der variable my $crypted was zu tun hat
diese variable steht unterer dem if (check())...was möglicherweise zum fehler geführt hat.Das crypten sollte erst ausgeführt werden,wenn sicher ist,dass das password existiert.my $crypted sieht so aus:
my $crypted = crypt($password, "Md") if ($password !~ /^Md/);
wie recht Du hattest...hatte echt ein problem noch zu lösen.
Das ist schlecht, was ist, wenn die Bedignung nicht zutrifft?
Dann wird $crypted nie initialisiert.
genau!
Ich vermute mla du willst eher sowas machen:
my $crypted = $password =~ /^Md/ ?
crypt($password, "Md") :
$password;
ja vielleicht noch m/^Md/
Es gibt in Perl durchaus die Möglichkeit Funktionen einen Parameter mit zugeben (in deinem Falle check($username, $password) z.b.)
wieso denn? Die werden doch am anfang deklariert mit
my $username = CGI::param('username')||'unbekannt';
my $password = CGI::param('password')||'';
ich habe die crypt in eine sub gepackt:
my $crypted = docrypt();
sub docrypt {
if ($password =~ m/^Md/) {
my $crypted = $password;
return $crypted;
}
else {
my $crypted = crypt($password, "Md");
return $crypted;
}
}
vielleicht wäre besser so?
sub docrypt {
if (CGI::param('password') =~ m/^Md/) {
my $crypted = $password;
return $crypted;
}
else {
my $crypted = crypt("$password", "Md");
return $crypted;
}
}
das sollte jetzt 100% gehen.
Gruss
Alain
P.S.Es handelt sich um mein cookieloginscript,was wir ja unten schon besprochen haben.
hi nochmal,
ich habe nun die Lösung des problems gefunden.
Das problem lag schon indirekt am split,aber auch daran,
dass bei der html ausgabe($u, $p) = split(/|/,.......
etwas noch nicht existierte,nähmlich das cookie.
wenn kein cookie da ist,kann er auch nichts spliten,dasselbe mit $u und $p,welches ausgegeben werden sollte,falls es cookie gibt.
habs jetzt so geschrieben bei der html ausgabe:
sub loginbox {
if (CGI::cookie("TFunLogin")){
($u, $p) = split(/|/,CGI::cookie("TFunLogin"));}
else
{
($u, $p) = ('unknow','');
}
print "Content-type: text/html\n\n";
print "<html><head><title> - access denied - </title>
</head>........etc.
Grüsse
Alain
habs jetzt so geschrieben bei der html ausgabe:
sub loginbox {
if (CGI::cookie("TFunLogin")){
($u, $p) = split(/|/,CGI::cookie("TFunLogin"));}
else
{
($u, $p) = ('unknow','');
}
Hatten wir doch alles schonmal :-(
my = $t = CGI::cookie("TFunLogin") || '';
my ($u, $p) = split /|/, $t;
Wenn du nicht undefinierte Werte haben willst:
my = $t = CGI::cookie("TFunLogin") || 'unknow|';
my ($u, $p) = split /|/, $t;
Struppi.
Ich habs mal mit if (/^$username:$crypted/) versucht,dann gibts zwar kein fehler im error log,aber dann funktioniert das script auch nicht mehr ?Kann man das auch anders als mit while lösen?
Dann ist $crypted nicht initialisiert, in dieser Variante wird nämlich nicht die Variabel verwendet sondern der String '$crypted'
Struppi.