in reply to Re: Search a hash for STDIN and report findings
in thread Search a hash for STDIN and report findings

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

Replies are listed 'Best First'.
Re^3: Search a hash for STDIN and report findings
by moritz (Cardinal) on Feb 07, 2008 at 19:37 UTC
    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.

      you guys probably want
      if ($ending eq '\n' or 'done')

      to be

      if ( ($ending eq '\n') or ($ending eq 'done') )
        We're both idiots, toolic ;-) (no offense meant).

        '\n' would only be the case if the user entered a literal backslash followed by an n. Not very likely to be intended. Since $ending is already chomped there's no need for a newline check at all.

        if ($ending eq 'done') is just fine, I think.

      Thank you for your infinite patiences