Alain: Use of uninitialized value...in concatenation (.) or string...

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

  1. 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

    --
    »Sie kochten heimlich mit Wasser und tranken öffentlich Wein.«
    1. 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

      1. 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.

        1. 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.

        2. 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

          1. 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.

  2. 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.