John W. Burns am Mittwoch, 21. Dezember 2005 16.22:
> 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?
moo is called, but has some errors resulting in no output, see below:
> 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;
*if* you want to make a ref:
my $radius_ref = [EMAIL PROTECTED];
but there is no need to make a ref only to dereference it later.
> 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"
print "$key => $dispatch{$key}\n";
($dispatch is a hash, not a hash ref)
> }
>
>
> my $input;
> foreach $input("foo", "moo"){
> 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>