Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people, just like you, are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
Solved

Scalar matching and if/elsif statement problems...

Posted on 2004-04-28
3
357 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

Making a simple AJAX shopping cart Couple years ago I made my first shopping cart, I used iframe and JavaScript, it was very good at that time, there were no sessions or AJAX, I used cookies on clients machine. Today we have more advanced techno…
Batch, VBS, and scripts in general are incredibly useful for repetitive tasks.  Some tasks can take a while to complete and it can be annoying to check back only to discover that your script finished 5 minutes ago.  Some scripts may complete nearly …
The viewer will learn how to create and use a small PHP class to apply a watermark to an image. This video shows the viewer the setup for the PHP watermark as well as important coding language. Continue to Part 2 to learn the core code used in creat…
Video by: Mark
This lesson goes over how to construct ordered and unordered lists and how to create hyperlinks.

829 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