2013-02-14 3 views
1

Я использую этот же кусок кода с различными файлами пару раз сквозными из программы без проблем:Открыть файл возвращает только последнюю строку файла

#if the info is part of a file 
if($proteinIn =~ m/\.txt$/i){ 
    my $input_file = catfile('..', dataset => $proteinIn); 

    open my $protein_file, '<', $input_file 
     or die "couldn't open '$input_file': $!"; 
    while (my $protLine = <$protein_file>) { 
     print $protLine."\n"; 
     $protLine =~ s/\s+\z//; # remove all trailing space 
     $protein{$protLine} = 1; 
    } 
    close $protein_file; 
} 

При чтении в файле, содержащем этот

Q5KDZ7_CRYNJ 
Q2U9C0_ASPOR 
Q2U048_ASPOR 
G2Q3M9_THIHA 
G2QAZ2_THIHA 

заявление на печать "print $ protLine." \ N ";" только печатает последнюю строку. В этом случае:

G2QAZ2_THIHA 

другой пример этого в моей программе читает каждую строку файлов заданного

foreach my $tempFile(@fileList){ 
    my $input_file = catfile('..', dataset => $tempFile); 

    open my $ps_file, '<', $input_file 
     or die "couldn't open '$input_file': $!"; 
    while (my $line = <$ps_file>) { 
     $line =~ s/\s+\z//; # remove all trailing space 

     my @curLine = split /\t/, $line; 
<the rest of the program> 

файлы, открываемые этим кодом содержать такие строки:

>sp|Q6GZX4|001R_FRG3G Putative transcription factor 001R OS=Frog virus 3 (isolate Goorha) GN=FV3-001R PE=4 SV=1 MAFSAEDVLKEYDRRRRMEALLLSLYYPNDRKLLDYKEWSPPRVQVECPKAPVEWNNPPSEKGLIVGHFSGIKYKGEKAQASEVDVNKMCCWVSKFKDAMRRYQGIQTCKIPGKVLSDLDAKIKAYNLTVEGVEGFVRYSRVTKQHVAAFLKELRHSKQYENVNLIHYILTDKRVDIQHLEKDLVKDFKALVESAHRMRQGHMINVKYILYQLLKKHGHGPDGPDILTVKTGSKGVLYDDSFRKIYTDLGWKFTPL FRG3G 

Почему первый пример кода печатает только последнюю строку файла?

Редактировать: Ответ, чтобы прокомментировать, что проблема восходящего потока в коде; К счастью, моя проблема находится рядом с начала так здесь все до проблемного кода

При выполнении кода, я использовал команду «Perl regProt.pl„“„“„truePool.txt uniprot_sprot.dat“,„грибы“

#!/usr/bin/env perl 
use strict; 
use File::Spec::Functions qw(catfile); 

#use warnings; 
#@author David Dziak 

#A program for quick regex functions on uniprot data to test protein signatures 
#my $max = 325783; 
#my $cur = 0; 
my $annotation; 
my $fingerprint = $ARGV[0]; 
unless($fingerprint){ 
    $fingerprint = "[GASRK][KRVSG][RKVI][KRVI]x[ASCR]x[AST]x(0,45)[GATF]xxx[VLI]N[GKND]x(11,12)[RKL]x(16,18)[NDA]x(6)[GS]GGx(10)[AG][LIVM][GAS][KR][GASN][VLI]";#prosite s9 

    #$fingerprint = "[GS]Gx(2)[GSA][QK]x(2)[SA]x(3)[GSA]x[GSTAV][KR][GSALVD][LIFV]";#prosite s9 
    #$fingerprint = "[STDNQ]G[KRNQMHSI]x(6)[LIVM]x(4)[LIVMC][GSD]x(2)[LFI][GAS][DE][FYM]x(2)[ST]";#prosite s19 
    #$fingerprint = "[RKHN][KSTR]X(3)[AVSCR]X(6)GXGX(0,23)X(25)GGGX(2)[GAS][QRKS]X(0,50)X(20)[APS]RX(5)[VSTA]XR";#s9 
    #$fingerprint = "[GAR][RKHG][RKHNT][KSTR]X(3)[AVSCR][RASTHKQLP]X(5)[GPSTND]X[GPSTKDQ]X(4)[NDVGIT]X(0,60)G[GS]GX(2)[GSA][QRS]X(0,70)[QTRA][FWYETK][STAVH][KY][RK]";#s9 
    #$fingerprint = "[RGWCKT]X(5)PX(3)[GARDENS]X(4)[VIL][HYF]XGX(7)[LIVMP]X(7)x[LFI][GASR][DEA][FYME]";#s19 
} 
$annotation .= $fingerprint; 
#protein name to search 
my $proteinIn = $ARGV[1]; 
my %protein; 
#if the info is part of a file 
if($proteinIn =~ m/\.txt$/i){ 
    my $input_file = catfile('..', dataset => $proteinIn); 
+1

Что такое catfile? – squiguy

+0

Ваш пример отлично работает, перед кодом, который вы показали, должно быть что-то еще. Или вы читаете другой файл. –

+1

@squiguy: catfile предположительно из File :: Spec :: Functions – ysth

ответ

2

Я держу пари, что ваш файл по каким-то причинам линии разделены \r, не \n

Попробуйте положить сверху:.

use Data::Dumper; 
$Data::Dumper::Useqq=1; 

и заменяя печать:

print Data::Dumper::Dumper($protLine); 
+0

В этом была проблема. Я должен был знать; это второй раз, когда мне приходилось публиковать здесь из-за этих чертовски. $ line = ~ s/\ s + \ z //; было исправление до последнего, когда chomp() не работал. –

Смежные вопросы