Solved

Scalar matching and if/elsif statement problems...

Posted on 2004-04-28
3
356 Views
Last Modified: 2013-12-25
Here's my script. I want the script to be able to take the "email" input value and check and see if it already exists in a file, if not, add it, if it does, alert the user that it already exists.

Code:
--------------------------------------------->>
#!/usr/bin/perl -wT

use CGI qw(:standard);
use CGI::Carp qw(warningsToBrowser fatalsToBrowser);

use Fcntl qw(:flock :seek);

   print "Content-type: text/html\n\n";


sub add {
open(USER, ">>users.txt") or &dienice("Sorry\, there has been a problem\nadding you to our User File\.\nClick Back on Your Browser and try again\.: $!");
    flock(USER, LOCK_EX);
    seek(USER,0,2);
    print USER param('email');
print USER "\n";
close(USER);

print <<EndHTML;
<html>
<head>
<script>
function goBack(){
  history.go(-1);
}
</script>
</head>
<body onload="goBack();">
</body>
</html>
EndHTML
}


open(USER, "users.txt") or &dienice("Sorry\, there has been a problem\nadding you to our User File\.\nClick Back on Your Browser and try again\.: $!");
flock(USER, LOCK_SH);
seek(USER,0,0);
@list = <USER>;
close(USER);

$email = param('email');
$email =~ s/%(..)/pack("c",hex($1))/ge;

$num = $#list;
for ($i = 0, $i => $num, $i++){
$comp = $list[$i];

if ($comp == $email){
      print "Sorry, there has been an error, the e-mail address you entered already exists. Please Click Back on Your Browser and try again.<br>";
     last;
}
elsif ($i => $num){
     add();
     last;
}
}
---------------------------------------------<<

Can anyone tell me why the following statement always comes up true, despite the user's e-mail not being in the file?
--------------------------------------------->>
if ($comp == $email){
      print "Sorry, there has been an error, the e-mail address you entered already exists. Please Click Back on Your Browser and try again.<br>";
     
last;
}
---------------------------------------------<<

And if I change it to the "eq" string comparison it always returns false, even when the e-mail address is in the file.

It was also suggested to me to use "List::Compare" with the "get_union" function, only to find that my Hosting company doesn't have the "List::Compare.pm" module installed.

Any ideas?
0
Comment
Question by:ziffgone
  • 2
3 Comments
 
LVL 18

Accepted Solution

by:
kandura earned 125 total points
ID: 10943254
$comp == $email is always true in your situation, because you are dealing with strings.
== test for _numerical_ equality, and most strings evaluate as 0 when coerced into a numerical context.
What you want is a string equality test, and that's what eq is for:
$comp eq $email.

There is no great need for external modules, but you may improve the performance by not preloading the entire file. Instead, process the file line by line, and quit when you have a match. Let me sketch this idea out for you:

$email = param('email');
$found = 0;
open USER, "users.txt";
while(<USER>) {
   chomp;
   if($email eq $_) {
      print "Already in there!";
      $found = 1;
      last;
   }
}

unless($found) {
    add();
}
0
 
LVL 14

Author Comment

by:ziffgone
ID: 10944676
Would the "unless($found)" statement come outside "close USER;" then? As the add(); function will write to the file when "$email" is not found.
0
 
LVL 14

Author Comment

by:ziffgone
ID: 10944726
Never mind, tested it myself.

BING, BING, BING, BING....

kandura gets the points!

I wanted to use the "while" function anyway, so your solution is a perfect fit.

Thanks a b'zillion kandura!

Regards...
0

Featured Post

Master Your Team's Linux and Cloud Stack

Come see why top tech companies like Mailchimp and Media Temple use Linux Academy to build their employee training programs.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

It is a general practice to get rid of old user profiles on a computer  in a LAN environment. As I have been working with a company in a LAN environment where users move from one place to some other place at times. This will make many user profil…
This article is meant to give a basic understanding of how to use R Sweave as a way to merge LaTeX and R code seamlessly into one presentable document.
The viewer will learn how to count occurrences of each item in an array.
The viewer will learn the basics of jQuery, including how to invoke it on a web page. Reference your jQuery libraries: (CODE) Include your new external js/jQuery file: (CODE) Write your first lines of code to setup your site for jQuery.: (CODE)

823 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question