I'm building a diagnostic medical questionnaire using Perl Tk.  Need to
create a Tk callback process for several hundred sub routines.
I've experimented with the following code.  It does recognize the two
subroutines "foo" and "moo", but calls only the first
subroutine "foo"; it does give correct answer.  It doesn't call "moo."  Perl
Cookbook indicates use of backslash operator
to create a reference to a named function but not for unnamed ones.  Can
anyone show me what I'm doing wrong?
Thanks
John Burns

#!/usr/local/bin/perl
use warnings;

 # reference_to_functions8.pl
 # Dispatch Tables

 # See Making Sense of Subroutines
 #by Rob Kinyon | Pages: 1, 2, 3, 4

 # Adding and removing available subroutines is
 # simpler than the if-elsif-else scenario, and
 # this is much safer than the soft references scenario.
 # Perl Cookbook 11.4 shows following example

 my %dispatch = (
     "foo" =>  sub {
  my $x = 3;
  my $ans = ($x**2);

  print "answer is: $ans \n"; #prints "answer is: 9"


  },
 "moo" =>  sub {
  my @data = (3,5,13);
  my $radius;
  my $radius_ref = @data;
  foreach  $radius(@$radius_ref) {

  print "my radius is: $radius \n";

   my $area = 3.14159 * ( $radius ** 2);
   print "and circle area is $area \n";

  }
  }
 );


 my $name;
 my $key;
 my $dispatch;

 #use following to test for key name in hash
 foreach $name("foo", "moo") {

  if (exists $dispatch{$name}) {
   print "$name is a subroutine.\n";

  }
  else {
   print "$name is not a subroutine.\n";
  }
 }

   #use following to test for presence of a key in a hash
  foreach $key (keys %dispatch) {
   print "$key => $dispatch->{$key}\n"
  }


 my $input;
 foreach $input("foo", "moo"){ #PCB 11.4 uses chomp($input = <STDIN>) in
lieu of "foreach"
 if ( exists $dispatch{ $input } ) {
      $dispatch{ $input }->(  );
 }
 else {
     die "Cannot find the subroutine $input\n";
 }

 }




-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to