trenchwar has asked for the wisdom of the Perl Monks concerning the following question:

I have a script that ultimately asks the user for input. I want to use that input to search against the hash. For simplicity sake we will say if the input is found in the hash it will print "found" if not it will print "not found" Here is a snippet of the bottom of the code. My assumption is the exist doesn't report efficiently because it isn't comparing the user input to the hash.
my $username = "$lname, $fname"; %new_hash; $new_hash{$username} = $password; while() { print "Please enter a last name and a frist name.\n"; chomp ($input =<STDIN>); { foreach ($input) { if (exists $new_hash{$username}) { print "The username is $username and the password is $new_hash +{$username}\n"; last; } else { print "I'm sorry, there is no one here by that name!\n"; last; } }

Replies are listed 'Best First'.
Re: Search a hash for STDIN and report findings
by moritz (Cardinal) on Feb 06, 2008 at 22:36 UTC
    As a first step, provide an example that compiles. Your example has too many opening and too few closing curly braces.

    foreach ($input)

    There's no need for a foreach loop over one element, so leave that out.

    I rewrote your example in a way that I think you intended:

    use strict; use warnings; my %passwords = ( moritz => 'secret', ); while(<STDIN>) { chomp; if (exists $passwords{$_}){ print "Password from $_ is '$passwords{$_}'\n"; } else { print "No password for $_, sorry\n"; } }

    And this is how a run could look like:

    $ perl script.pl moritz Password from moritz is 'secret' someone else No password for someone else, sorry
      Definitely better. I have put the entire little script below. The user name is formatted and stored in a hash key with the password as the value. I want to then have the user put in a first or last name and have it searched against the hash and return the user name and pass word if it is found..problem I am having is case sensitivity. Please pardon my useless script, I am trying to learn Perl.
      while(1) { print "Please enter your first name\n"; chomp ($fname =<STDIN>); { last; } print "Please enter your last name\n"; chomp ($lname =<STDIN>); { last; } print "Please enter a password\n"; chomp ($password =<STDIN>); { last; } print "Please enter 'done' or hit your return key\n"; chomp ($ending =<STDIN>); if ($ending eq '\n' or 'done') { last; } } my $username = "$lname, $fname"; %new_hash; $new_hash{$username} = $password; print "To search for a user please type in the last name, firstname an +d hit enter.\n"; while(<STDIN>) { chomp; if (exists $new_hash{$_}){ print "The username is $username and the password is $password +, please enter another name to search for.\n"; } else { print "I'm sorry, there is no one here by that name please try + again.\n"; } }
      Thank you! TW
        One problem is that your hash is empty after you tried to enter the values - there is no assignment to the hash.

        If you want to know the values of your hash, here's a little trick:

        use Data::Dumper; my %passwords; # please don't name your data structure # %new_hash. That's not a telling name at # all while(1) { print "Please enter your first name\n"; chomp ($fname =<STDIN>); { last; } print "Please enter your last name\n"; chomp ($lname =<STDIN>); { last; } print "Please enter a password\n"; chomp ($password =<STDIN>); { last; } print "Please enter 'done' or hit your return key\n"; chomp ($ending =<STDIN>); if ($ending eq '\n' or 'done') { last; } } my $username = "$lname, $fname"; # here comes the magic: print Dumper \%passwords; # you'll see that the hash # is empty. # rest of the script goes here

        You have to actually store the passwords:

        while(1) { print "Please enter your first name\n"; chomp ($fname =<STDIN>); { last; } print "Please enter your last name\n"; chomp ($lname =<STDIN>); { last; } print "Please enter a password\n"; chomp ($password =<STDIN>); { last; } # important: store the passwords in %passwords $passwords{$fname} = $password; print "Please enter 'done' or hit your return key\n"; chomp ($ending =<STDIN>); if ($ending eq '\n' or 'done') { last; } }

        Additionally the usual tips apply: always use strict; use warnings and declare your variables.

        To answer your original question: to achieve case insensitivity, use lc or uc to convert the strings (for example first name) to all lower or all upper case, and only then store them.