in reply to Changing the Value Assigned To A Hash Key

Works for me if I change your check to:
unless ($first_name_check eq 1) {
perl version is 5.8.6,
hth,
p

Thru the darkness of futures past, the magician longs to see.
One chants out, between two worlds - fire, walk with me.

Replies are listed 'Best First'.
Re^2: Changing the Value Assigned To A Hash Key
by gnurob (Initiate) on Feb 08, 2005 at 22:31 UTC

    Didn't work using an always fail function with any of the following tests:

    sub check_name { return 0; } unless (&check_name($app{"first_name"})) { # code } # , unless (&check_name($app{"first_name"}) == 1) { # code } # , unless (&check_name($app{"first_name"}) eq 1) { # code } # , or unless (&check_name($app{"first_name"}) eq "1") { # code } # perl -v # This is perl, v5.8.4 built for MSWin32-x86-multi-thread # (with 3 registered patches, see perl -V for more detail)
      Try running this on your commandline:
      use warnings; use strict; use Data::Dumper; my @errors; my %app; $app{"first_name"} = param('first_name'); # $app{"first_name"} = "test_value"; if (request_method() eq "POST") { my $first_name_check = &check_name($app{"first_name"}); unless ($first_name_check eq 1) { print "Not through namecheck\n"; $app{"first_name"} = ""; push (@errors, "First Name: ".$first_name_check); } } print Dumper \@errors; print Dumper \%app; sub request_method { return 'POST' } sub param { return 'testname' } sub print_application { # do some stuff with %app and @errors... } sub check_name { my $name = $_[0]; if ($name =~ /^[A-Z][A-Za-z\-']{2,40}/s) { return 1; } else { return "Helpful message."; }
      I got
      Not through namecheck $VAR1 = [ 'First Name: Helpful message.' ]; $VAR1 = { 'first_name' => '' };
      -- 
      Thru the darkness of futures past, the magician longs to see.
      One chants out, between two worlds - fire, walk with me.

        Did this for fun and the value shows in the textfield but not as the plain variable. Also tried removing the double quotes surrounding $app{'first_name'} in textfield().

        Tr( [ td( [ b('First Name:'), textfield(-name=>'first_name', -size=>'40', -maxlength +=>'40', -default=>"$app{'first_name'}") ] ), ] ), Tr( [ td( [ b('First Name:'), $app{'first_name'} ] ), ] );

        Those users sure better appreciate not having to re-type form data... :-)

        Works for me on the command line. Also works using most recent changes copied out of the script and into your test:

        unless (&check_name($app{"first_name"})) { undef $app{"first_name"}; push (@errors, "Helpful message..."); }

        It still doesn't work in CGI. I added use Data::Dumper and to the actual script and "Dumper" to the end of the &print_application function:

        sub print_application { header, start_html, table({-border=>'0' -class=>'boxed'}, Tr( [ td([b('First Name:'), "$app{'first_name'}"]) ] ), p("Value is", $app{'first_name'}), pre( Dumper \@errors, Dumper \%app ), end_html; }

        Oddly enough, this is what comes out the other side:

        A form element with the value "nameCheckFailsIfNumbersPresent12345" in + a table, and... Value is # <- undef here has it should be. But not above? $VAR1 = [ 'Names must be between two and forty total characters, start + with an initial capitol, and may only contact alphabetical character +s, a dash, or an apostrophe.' ]; $VAR2 = '$VAR1 = { \'first_name\' => undef }; ';

        That looks like it works, except this line from the same print_application function: print textfield(-name=>'first_name', -size=>'40', -maxlength=>'40', -default=>"$app{'first_name'}");

        returns... <input type="text" name="first_name" value="nameCheckFailsIfNumbersPresent12345" size="40" maxlength="40">

        Why is the value "nameCheckFailsIfNumbersPresent12345" present in $app{'first_name'} but not in Dumper \%app or p("Value is", $app{'first_name'}) - all of which are called from inside the function?