[Bioperl-l] perl one-liner with Bio::SeqIO

Stefan Kirov stefan.kirov at bms.com
Thu Jul 22 19:37:18 UTC 2010


Chris,
I tested tell and for me it actually returns the correct position. I think

seek($fh, $start_pos, 0) || $self->throw("Failed resetting the filehandle pointer; IO
error occurred");

might be better.

On 7/22/2010 2:35 PM, Chris Fields wrote:
> It's fairly easy to check if something is seekable, using tell() (from perldoc -f tell):
>
> tell() on pipes, fifos, and sockets usually returns -1.
>
> My guess is this is something that should be really be handled by Bio::Root::IO, then SeqIO could check this:
>
> if (!$self->seekable) {
>     #die a horrible death
> }
>
> chris
>
> On Jul 22, 2010, at 12:51 PM, Stefan Kirov wrote:
>
>    
>> Sorry for copying you all, but my posts to bioperl list do not go through (my headers seem suspicious).
>> I proposed (comment on the bug) that seek throws an IO error, I think this would be good practice in general (device gets disconnected, etc.)
>> I agree with Aaron that one option would be that if STDIN is the input format MUST be specified or parser dies.
>> Another option is to right to a temp file or slurp into memory. This could be dangerous though...
>>
>> On 7/22/2010 1:15 PM, Aaron Mackey wrote:
>>      
>>> You cannot seek on a pipe, unfortunately.  SeqIO should probably try to detect this, and die rather than invoking GuessSeqFormat.
>>>
>>> -Aaron
>>>
>>> On Thu, Jul 22, 2010 at 10:30 AM, Stefan Kirov<stefan.kirov at bms.com<mailto:stefan.kirov at bms.com>>  wrote:
>>>
>>>     From what I see in /bioperl-live/Bio/Tools/GuessSeqFormat.pm
>>>
>>>        if (defined $self->{-file}) {
>>>            # Close the file we opened.
>>>            close($fh);
>>>        } elsif (ref $fh eq 'GLOB') {
>>>            # Try seeking to the start position.
>>>     >>>         seek($fh, $start_pos, 0);
>>>        } elsif (defined $fh&&  $fh->can('setpos')) {
>>>            # Seek to the start position.
>>>            $fh->setpos($start_pos);
>>>        }
>>>        return ($done ? $fmt_string : undef);
>>>
>>>      seek($fh, $start_pos, 0); does not reset as expected- tell $fh
>>>     after reset is where the second non-null line starts.
>>>     I am not sure why- all manuals claim this should work?
>>>     Hope this helps.
>>>     Stefan
>>>
>>>     On 7/22/2010 9:27 AM, Chris Fields wrote:
>>>
>>>         cat test.fa | perl -MBio::SeqIO -e 'my $seq=Bio::SeqIO->new(-fh
>>>         >>>   =>\*STDIN); while ($myseq=$seq->next_seq){ print
>>>         >>>   $myseq->id,"\t",$myseq->seq,"\n"}
>>>
>>>
>>>
>>>     _______________________________________________
>>>     Bioperl-l mailing list
>>>     Bioperl-l at lists.open-bio.org<mailto:Bioperl-l at lists.open-bio.org>
>>>     http://lists.open-bio.org/mailman/listinfo/bioperl-l
>>>
>>>
>>>        
>> <stefan_kirov.vcf>
>>      
>
>    

-------------- next part --------------
A non-text attachment was scrubbed...
Name: stefan_kirov.vcf
Type: text/x-vcard
Size: 207 bytes
Desc: not available
URL: <http://lists.open-bio.org/pipermail/bioperl-l/attachments/20100722/3e479cfe/attachment-0004.vcf>


More information about the Bioperl-l mailing list