Syntax error with Switch and prototyped-subroutines

P

Paul Lalli

I've been pounding my head on this for almost a day, and I'm still not
seeing what I'm doing wrong. Can someone please give me a hand?

This (short-but-complete) script works as expected:

#!/usr/bin/perl
use strict;
use warnings;
use Switch;

sub foobar ($\%) {
my $foo = shift;
my $hash_ref = shift;
switch ('hello'){
case (/^[A-Z]+$/) { print "All upper\n"; }
case (/^[a-z]+$/) { print "All lower\n"; }
else { print "Mixed case\n"; }
}
}

my %temp;
foobar('world', %temp);

__END__
All lower

If, however, I switch the order of the prototyped arguments to the
subrtouine, I get a syntax error involving the switch block:

#!/usr/bin/perl
use strict;
use warnings;
use Switch;

sub foobar (\%$) {
my $hash_ref = shift;
my $foo = shift;
switch ('hello'){ # <== LINE 9
case (/^[A-Z]+$/) { print "All upper\n"; }
case (/^[a-z]+$/) { print "All lower\n"; } # <== LINE 11
else { print "Mixed case\n"; }
}
}

my %temp;
foobar(%temp, 'world');

__END__

syntax error at switchtest.pl line 9, near "){"
syntax error at line 11, near ") {"
Execution of switchtest.pl aborted due to compilation errors.

This seems to occur only when the prototype involves a \% , and that \%
appears as anything but the last element in the prototype list. If the
\% is last, the script parses correctly.

I have seen this behavior on both perl 5.8.5 for Solaris and
Activestate's perl 5.8.4 for Windows, both using Switch.pm v2.10

Can someone please point me at what I'm doing wrong? Is \% somehow
disallowed as anything but the last prototype element? (This seems
unlikely, as the script will work fine if the switch block is removed,
regardless of where the \% occurs).

Thank you,
Paul Lalli
 
J

John Bokma

Paul Lalli said:
I have seen this behavior on both perl 5.8.5 for Solaris and
Activestate's perl 5.8.4 for Windows, both using Switch.pm v2.10

Add perl, v5.8.7 built for MSWin32-x86-multi-thread, Switch 2.10.
 
T

thundergnat

Paul said:
I've been pounding my head on this for almost a day, and I'm still not
seeing what I'm doing wrong. Can someone please give me a hand?

If, however, I switch the order of the prototyped arguments to the
subrtouine, I get a syntax error involving the switch block:

#!/usr/bin/perl
use strict;
use warnings;
use Switch;

sub foobar (\%$) {
my $hash_ref = shift;
my $foo = shift;
switch ('hello'){ # <== LINE 9
case (/^[A-Z]+$/) { print "All upper\n"; }
case (/^[a-z]+$/) { print "All lower\n"; } # <== LINE 11
else { print "Mixed case\n"; }
}
}

my %temp;
foobar(%temp, 'world');

__END__

syntax error at switchtest.pl line 9, near "){"
syntax error at line 11, near ") {"
Execution of switchtest.pl aborted due to compilation errors.

This seems to occur only when the prototype involves a \% , and that \%
appears as anything but the last element in the prototype list. If the
\% is last, the script parses correctly.


OT: Why, oh why do you want to use prototypes in the first place? Just
pass a hash reference and be done with it.

Back on topic.

In poking around at it, it seems to boil down to a bug in the source
filtering done by the Switch module. If you deparse the script with
prototype checking disabled, the entire foobar subroutine seems to
get truncated to:

sub foobar (\%$) ;

Where exactly the bug may be, I couldn't tell you. It may not even
be due to the source filtering, but that seems to me to be most
probable.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,768
Messages
2,569,574
Members
45,049
Latest member
Allen00Reed

Latest Threads

Top