Hallo,
open (pass, "<$user") or &error("Unable to open the User data.");
Besser wäre die Verwendung von PASS für den Filehandle, da das sich si eingebürgert hat. Anderen fällt es dann leichter, Deinen Code zu verstehen.
if ($flock eq "y") {
flock pass, 2;
}
$pass=<pass>;
Hier liest Du nur eine Zeile ein ... [1][2]
chop ($pass);
... entfernst das letzte Zeichen von $pass, egal welches ...
@all = split(/\n/);
... und trennst an \n auf, was aber aller Voraussicht nach durch chop entfernt wurde.
Das Ergebnis ist, daß in @all nur eine Element enthalten ist, welches den gleichen Inhalt hat wie $pass. Abgesehen davon, wird @all sowieso nich mehr verwendet.
close(pass);
$compare=$input{'name'};
$compare=lc($compare);
$compare=~ s/\s//g;
chomp($pass);
Hmm, jetzt bin ich verwirrt. Hier entfernst Du wieder das letzte Zeichen aus $pass, aber nur wenn es ein \n (genauer: $/) ist. [2]
@check=split(/|/, $pass);
@check[0]=lc(@check[0]);
@check[0]=~ s/\s//g;
if ($compare eq "@check[0]" and $compare == "@check[0]") {
Mal sehen, wann trifft das zu? Doch nur wenn in $compare und @check[0] eine Zahl steht.
print "<font color="$other_color" face="$font_face" size="$font_size">Der Name <b>$input{'name'}</b> ist mit einem Passwort versehen.
Bitte geben Sie das Passwort ein, um sich zu authorisieren!<br><br>\n
<b>Passwort:</b><input type="password" name="password"><br><br></font>\n";
}
Um alle Zeilen einer Datei abzuarbeiten fallen mir ad hoc zwei einfache Möglichkeiten ein:
1.) Du liest Zeile für Zeile aus, und analysierst diese. Falls Du gefunden hast, was Du suchst, brichst Du das Durchsuchen des Files ab und setzt mit der weiteren Programmabarbeitung fort.
2.) Du liest erst mal alle Zeilen in eine Liste, und durchsuchst diese.
Erstere Variante gefällt mir persönlich besser, da sie mit weniger Speicher und geringerer Ausführungsgeschwindigkeit auskommt, da ja nicht der ganze Inhalt eingelesen wird, wenn die gesuchte Zeile am Anfang der Datei steht.
Hier also mein (grober) Vorschlag
open (PASS, "<$user") or &error("Unable to open the User data.(Reason: $!)");
if ($flock eq "y") {
flock PASS, 2 or &error("Unable to flock the User data.(Reason: $!)");
}
$compare=$input{'name'}; lassen wir fallen, da unnötig
my $compare=lc($input{'name'});
$compare=~ s/\s//g;
my($user,$pass,$found); #ausserhalb der schleife festgelegt um die Daten für weitere Verwendung zu erhalten
$found = 0;
CHECKUSER:
while(<PASS>) # Inhalt der Zeile steht in $_
{
chomp; #entfernt nur \n am Ende der Zeile, falls vorhanden (s.o.)
($user,$pass) = split (/|/,$_,2); # die 2 ist nicht ganz unwichtig, da im Passwortfeld ev. auch | stehen könnte [3]
if ($user eq $compare) #brechen wir ab, wenn wir gefunden haben
{
$found = 1;
last CHECKUSER ;
}
}
close(PASS) or &error("Unable to close the User data. (Reason: $!)")
#ab hier weiter im Programm
if($found)
{
# wir haben den richtigen User gefunden, jetzt machen wir was draus
}
Hier sind noch einige Anmerkungen.
Verwende immer my, um Variablen im Programm einzuführen, und zwar in Verbindung mit 'use strict;'. Das erleichtert die Fehlersuche ungemein, und wird spätestens beim Einsatz von mod_perl unerläßlich.
Im Fehlerfalle solltest Du immer den Fehlercode ($!) berücksichtigen, weil nur dadurch klar wird, warum der Fehler aufgetreten ist.
Grüße
Klaus
[1] sofern Du nicht $/ manipuliert hast.
[2] siehe perldoc perlvar
[3] siehe dazu perldoc -f split