The problem is that it is printing something for each line regardless of whether it has already found a match. What you need to do is save whether you have found a match or not in a variable, then selectively print, ie:
a) set your variable to be false - ie indicating that you haven't found a match yet,
b) don't print anything if a particular line doesn't match - wait until the end of the loop to print that a match wasn't found (by checking that your variable is still false),
c) print that you have found a match when a particular line matches, store in your variable that you have found a match, and then *exit the loop* because you don't need to check any more.

I am not sure why you are passing in a password as you don't seem to be checking it anywhere. I am assuming that $field3 is NOT the password - in fact I couldn't see any possible password in your file. Are you checking the password at all???

Also, I'm not sure you really want to be using the regular expression you are using. If you use one at all, I would have thought you would want it the other way around, ie ($field2 =~ /\b$username\b/). This means if the line in the file read:

user: user1*&^ realm: my.domain.com mech:PLAIN

then entering $username='user1' would match this line.
With your regular expression of ($username =~ /\b$field2\b/) you are matching
$username='user1*&^'
to the line in the file:

user: user1 realm: my.domain.com mech:PLAIN

I don't know your needs but it seems to me that you would be better off without a regexp at all, just using ($username eq $field2). I have modified the code accordingly and put in the stuff I explained in a, b, c above (note that as we are not checking password, this will only match the first $username found in the file):

#!/usr/bin/perl
use CGI qw(param);

$username = param('username');
$password = param('password');

$file= "/home/user/public_html/file.txt";
print "Content-type: text/plain\n\n";
#we haven't found a match yet
my $foundmatch=0;
open (F1,"$file");
foreach (<F1>) {
chomp;
($field1,$field2,$field3,$field4,$field5,$field6) = split /\s/, $_;
if ($username eq $field2) {
#only print when we find a match
print "OK\n";
print "$username and $password\n";
#store that we have found a match so we don't print "oops try again" at the end
$foundmatch=1;
#exit the loop as we don't need to check anymore
last;
}
}
close(F1);
if (not $foundmatch) {
#we didn't find a match as $foundmatch is still false
print "oops try again\n";
}

"Glynn S. Condez" <[EMAIL PROTECTED]> wrote:

Hi it works now but why is it that it prints a lot of results and it seems
that it reads the
file line by line and do the output. Sorry i forgot to mention that the file
contains duplicate entries
of username, it something like:

----snip----
user: user1 realm: my.domain.com mech:PLAIN
user: user2 realm: my.domain.com mech:PLAIN
user: user1 realm: my.domain.com mech: DIGEST-MD5
user: user3 realm: my.domain.com mech:PLAIN
user: user2 realm: my.domain.com mech:DIGEST-MD5
---snip---

so if the file contents 10 lines of entries it display 10 lines of output,
here's the real output

if match is found, browser prints:
oppss try again
OK, user1 found
oppss try again
oppss try again
OK, user1 found
oppss try again
oppss try again
oppss try again
oppss try again
oppss try again

if no match found, browser prints:
oppss try again
oppss try again
oppss try again
oppss try again
oppss try again
oppss try again
oppss try again
oppss try again
oppss try again
oppss try again

Is it possible not to display all the entry that match and doesn't match,
just only print OK, user1 found and opps try again?

what should be added or changed on the code?

TIA
glen







> On Wed, 15 Jan 2003 15:54:02 +0800, [EMAIL PROTECTED] (Glynn
> S. Condez) wrote:
>
> >i have a web form that users can input a username and password and check
if
> >the username is valid by parsing or extracting the contents of a file,
here
> >the web form html:
>
> I'm not sure what you are trying to do with just the username,
> don't you want to check the password too?
>
> >#!/usr/bin/perl
> >use CGI qw(param);
> >
> >$username = param('username');
> >$password = param('password');
> >
> >$file= "/home/user/public_html/file.txt";
> >print "Content-type: text/plain\n\n";
> >open (F1,"$file");
> >foreach (<F1>) {
> >chomp;
> >($field1,$field2,$field3,$field4,$field5,$field6) = split /\s/, $_;
> >
> >if ($username =~ /\b$field2\b/) {
> if (($username =~ /\b$field2\b/)and ($password =~ /\b$field3\b/)) {
> print "OK\n";
> print "$username and $password\n";
>
> }else{
> print "oops try again\n";
> }
> }
> close(F1);
>
> >
> >and this is the content of the file.txt:
> >----snip----
> user: user1 password my.domain.com mech:PLAIN
>
> >user: user2 realm: my.domain.com mech:PLAIN
> >user: user3 realm: my.domain.com mech:PLAIN
> >user: user4 realm: my.domain.com mech:PLAIN
> >---snip---
> >
> >my problem with this script is, it doesnt display if the
> >username is valid or not but valid usernames display
> >OK, $username and $password.
> >
> >whats the problem with the else statement? kindly correct my
> >script.
> >
> >TIA
> >glen
> >--- Glynn ---
>
>
> --
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>


--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

_________________________________________________________________
The new MSN 8: smart spam protection and 2 months FREE* http://join.msn.com/?page=features/junkmail


--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to