[Omaha.pm] /^\s+(.*)/ && do { }

Jay Hannah jay at jays.net
Tue Oct 9 13:58:43 PDT 2007


Huh. I'm not sure if I like this or not, but it sure is tight.

The basic idea is given a file format like this where there are an 
unknown number of ACCESSION entries on an unknown number of lines:

LOCUS       BA000036             3309401 bp    DNA     circular BCT 
19-MAY-2007
DEFINITION  Corynebacterium glutamicum ATCC 13032 DNA, complete genome.
ACCESSION   BA000036 AP005274 AP005275 AP005276 AP005277 AP005278 AP005279
            AP005280 AP005281 AP005282 AP005283
VERSION     BA000036.3  GI:42602314
PROJECT     GenomeProject:307

While reading through the file keep pushing only your array until 
/^\s+(.*)/ fails. At that point 'last'.

  if( /^ACCESSION\s+(\S.*\S)/ ) {
     push(@acc, split(/\s+/,$1));
     while( defined($_ = $self->_readline) ) {
        /^\s+(.*)/ && do { push (@acc, split(/\s+/,$1)); next };
        last;
     }
     $buffer = $_;
     next;
  }

I don't remember seeing a ' && do {} ' construct before... And I'm 
confused by $buffer, but that's a different battle.  :)

j


Full source:
http://code.open-bio.org/cgi/viewcvs.cgi/bioperl-live/Bio/SeqIO/genbank.pm?rev=1.167&cvsroot=bioperl&content-type=text/vnd.viewcvs-markup




More information about the Omaha-pm mailing list