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

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.

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

        When taking out the \n the while loop keeps well...looping until 'done' is entered. Keeping it in ends the loop with a carriage return or the input.
Re^4: Search a hash for STDIN and report findings
by trenchwar (Beadle) on Feb 07, 2008 at 21:09 UTC
    Thank you for your infinite patiences