[Bioperl-guts-l]
bioperl-live/Bio/Factory FTLocationFactory.pm, 1.15, 1.16
Jason Stajich
jason at pub.open-bio.org
Wed Dec 29 15:38:45 EST 2004
Update of /home/repository/bioperl/bioperl-live/Bio/Factory
In directory pub.open-bio.org:/tmp/cvs-serv5201/Bio/Factory
Modified Files:
FTLocationFactory.pm
Log Message:
yuck. lookaheads and balanced parens. But this is a problem that has been around for a while, glad to finally fix it. bug #1674 describes the behavior. Couldn't previously handle nested join(join()) properly
Index: FTLocationFactory.pm
===================================================================
RCS file: /home/repository/bioperl/bioperl-live/Bio/Factory/FTLocationFactory.pm,v
retrieving revision 1.15
retrieving revision 1.16
diff -C2 -d -r1.15 -r1.16
*** FTLocationFactory.pm 23 Nov 2004 16:16:34 -0000 1.15
--- FTLocationFactory.pm 29 Dec 2004 20:38:42 -0000 1.16
***************
*** 124,128 ****
my ($self,$locstr,$is_rec) = @_;
my $loc;
!
# there is no place in FT-formatted location strings where whitespace
# carries meaning, so strip it off entirely upfront
--- 124,128 ----
my ($self,$locstr,$is_rec) = @_;
my $loc;
!
# there is no place in FT-formatted location strings where whitespace
# carries meaning, so strip it off entirely upfront
***************
*** 131,136 ****
# does it contain an operator?
if($locstr =~ /^([A-Za-z]+)\((.*)\)$/) {
# yes:
! my $op = $1;
my $oparg = $2;
if($op eq "complement") {
--- 131,137 ----
# does it contain an operator?
if($locstr =~ /^([A-Za-z]+)\((.*)\)$/) {
+
# yes:
! my $op = lc($1);
my $oparg = $2;
if($op eq "complement") {
***************
*** 138,142 ****
$loc = $self->from_string($oparg, 1);
$loc->strand(-1);
! } elsif(($op eq "join") || ($op eq "order") || ($op eq "bond")) {
# This is a split location. Split into components and parse each
# one recursively, then gather into a SplitLocationI instance.
--- 139,143 ----
$loc = $self->from_string($oparg, 1);
$loc->strand(-1);
! } elsif($op eq "join" || $op eq "order" || $op eq "bond" ) {
# This is a split location. Split into components and parse each
# one recursively, then gather into a SplitLocationI instance.
***************
*** 146,152 ****
$loc = Bio::Location::Split->new(-verbose => $self->verbose,
-splittype => $op);
! foreach my $substr (split(/,/, $oparg)) {
! $loc->add_sub_Location($self->from_string($substr, 1));
}
} else {
$self->throw("operator \"$op\" unrecognized by parser");
--- 147,179 ----
$loc = Bio::Location::Split->new(-verbose => $self->verbose,
-splittype => $op);
!
! # have to do this to capture nested joins, something like this
! # join(11..21,join(100..300,complement(150..230)))
! # This fixes bug #1674
! my $re;
! $re = qr{
! \(
! (?:
! (?> [^()]+ ) # Non-parens without backtracking
! |
! (??{ $re }) # Group with matching parens
! )*
! \)
! }x;
! my @sections;
! if( $oparg =~ s/(.*),(join|order|bond)/$2/i) {
! push @sections, split(/,/,$1);
! }
! # lets capture and remove all the sections which
! # are groups
! while( $oparg =~ s/(join|order|bond)$re//ig ) {
! push @sections, $&;
}
+ push @sections, split(/,/,$oparg) if length($oparg);
+ # end of fix for bug #1674
+ foreach my $s (@sections) {
+ $loc->add_sub_Location($self->from_string($s, 1));
+ }
+
} else {
$self->throw("operator \"$op\" unrecognized by parser");
More information about the Bioperl-guts-l
mailing list