On Mon, Nov 22, 2010 at 11:53 AM, Greg Grant <[email protected]> wrote:
> The following script runs on 5.8 but does not run on 5.10. I
> distilled out a short program with the heart of the bug. The output of
> this script could be achieved easily without recursion but my real
> sort routine does need to be recursive, but I removed most of the
> code. Ignore the fact that this doesn't achieve something useful as
> is, the point is it runs on 5.8 and not on 5.10.
>
> use strict;
> my %SAM;
> $SAM{chr2LHet} = 1;
> $SAM{chr2RHet} = 1;
> $SAM{chr3LHet} = 1;
> $SAM{chr3RHet} = 1;
> foreach my $chr (sort cmpChrs keys %SAM) {
> print "CHR=$chr\n";
> }
> sub cmpChrs () {
> if($a =~ /chr(\d+)/) {
> my $numa = $1;
> if($b =~ /chr(\d+)/) {
> my $numb = $1;
> if($numa < $numb) { return 1; }
> else {
> $a =~ s/chr\d+//;
> $b =~ s/chr\d+//;
> my %temp;
> $temp{$a}=1;
> $temp{$b}=1;
> foreach my $key (sort cmpChrs keys %temp) {
> if($key eq $a) { return 1; }
> else { return -1; }
> }
> }
> } else { return 1; }
> }
> return 1;
> }
>
> -------------------------------------------------------------------------------------------------------------------------------------------
>
Declare the subroutine before calling sort. Something like this...
sub cmpChrs();
foreach my $chr (sort cmpChrs keys %SAM) {
print "CHR=$chr\n";
}
The *sort* documentation for 5.12 shows three forms:
- sort SUBNAME LIST
- sort BLOCK LIST
- sort LIST
I'm guessing that the later version of Perl assumed a different form. By
declaring *cmpChrs* beforehand, Perl knows exactly what you want.
--
Robert Wohlfarth