in reply to Re-assign value to subroutine

Your description is a little confusing, but I'm guessing you want to have choice 1 do something based on an option and choice 2 set the option (with choice 1 using a default value if the option isn't set yet). If so, you need somewhere to store the option. Your sub options could do this itself:
{ my $saved_option = 10; # default value is 10 sub options{ # were we passed a value to save for later? if (@_) { $saved_option = shift; } return $saved_option } }
or just use a variable instead of the subroutine:
my $option = 10; while (1) { print"choose 1 or 2 \n"; my $choice=(<STDIN>) or last; if ($choice == 1) { &flashcard($option); } elsif ($choice == 2) { print"enter random range\n"; my $option = (<STDIN>); } else { last } } sub flashcard { my $option = shift; my $random = int(rand($option)); # do stuff with $random }
By the way, your code had so many errors, it's clearly not what you were trying. It really helps if you show the exact code you are working with.

Replies are listed 'Best First'.
Re^2: Re-assign value to subroutine
by props (Hermit) on Nov 19, 2007 at 23:04 UTC
    Here is the initial code
    use warnings; use strict; print "Welcome to Multiplication Challenge\n"; print "What would you like to do?\n"; print "1) FLASHCARD MODE\n"; print "2) TEST MODE\n"; print "3) OPTIONS\n"; print "4) Exit\n"; my $input = undef; my $max = undef; my $min = 10; sub menu { print "What would you like to do?\n"; print "1) FLASHCARD MODE\n"; print "2) TEST MODE\n"; print "3) OPTIONS\n"; print "4) Exit\n"; } while ( $input = (<STDIN>) ) { if ( $input =~ /1/ ) { print "FLASHCARD MODE\n"; flashcard(); } elsif ( $input =~ /2/ ) { print "TEST MODE\n"; testmode(); } elsif ( $input =~ /3/ ) { print "3\n"; print "What is the maximum number?\n"; my $max = (<STDIN>); &makeitbig($max); &menu(); } elsif ( $input =~ /4/ ) { really(); } } sub really { print "Are you sure?\n"; my $input = (<STDIN>); if ( $input =~ /y/ ) { exit; } else { menu(); } } sub flashcard { for ( 1 .. 10 ) { my $random1 = int( rand(10) ); my $random2 = int( rand(10) ); print "$random1 * $random2\n"; my $total = ( $random1 * $random2 ); &validate($total); } } my $count = 1; sub validate { my $newdata = shift; TRYAGAIN: my $input = (<STDIN>); if ( $input == $newdata ) { print "Correct!\n"; $count++; if ( $count == 10 ) { print "Congratulations\n"; print "You have finished FLASHCARD MODE;\n"; menu(); } } else { print "$count: Try again\n"; goto TRYAGAIN; } } sub testmode { for ( 1 .. 25 ) { my $random1 = int( rand(10) ); my $random2 = int( rand(10) ); print "Problem '#'$_\n"; print "$random1 * $random2\n"; my $total = ( $random1 * $random2 ); &validate_low($total); } } my $meter = 1; my @correct = (); my $correctanswer = 1; sub validate_low { my $newdata = shift; my $input = (<STDIN>); $meter++; if ( $input == $newdata ) { print "Correct!\n"; push( @correct, $correctanswer ); } else { print "Sorry!\n"; } if ( $meter == 25 ) { &calculate(); } } my $sum = 0; sub calculate { foreach (@correct) { $sum += $_; return $sum; } my $prcnt = 4 * $sum; print "You got $sum answers correctly out of 25. This is $prcnt%\n +"; } sub makeitbig { my $other = shift; if ( $other == $min ) { return $min; } else { return $other; } }